今天来写一下后台C#代码如何访问webapi 这里使用HttpClient方法访问webapi也是很常用的方法。
因为我在是webapi项目里直接写的,为了方便就直接读取了当前地址,代码包括 webapi的所有用法【Getstring GetClass GetListClass Post put Delete】。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
//后台client方式GET提交 HttpClient myHttpClient = new HttpClient(); //提交当前地址的webapi string url = "http://" + System.Web.HttpContext.Current.Request.Url.Host + ":" + System.Web.HttpContext.Current.Request.Url.Port.ToString(); myHttpClient.BaseAddress = new Uri(url); //GET提交 返回string HttpResponseMessage response = myHttpClient.GetAsync( "api/ApiDemo/Get2" ).Result; string result = "" ; if (response.IsSuccessStatusCode) { result = response.Content.ReadAsStringAsync().Result; } //return Content(JsonConvert.SerializeObject(result)); Product product = null ; //GET提交 返回class response = myHttpClient.GetAsync( "api/ProductsAPI/GetProduct/1" ).Result; if (response.IsSuccessStatusCode) { product = response.Content.ReadAsAsync<Product>().Result; } //return Content (JsonConvert.SerializeObject(product)); //put 提交 先创建一个和webapi对应的类 var content = new FormUrlEncodedContent( new Dictionary< string , string >() { { "Id" , "2" }, { "Name" , "Name:" +DateTime.Now.ToString() }, { "Category" , "111" }, { "Price" , "1" } }); response = myHttpClient.PutAsync( "api/ProductsAPI/PutProduct/2" , content).Result; if (response.IsSuccessStatusCode) { result = response.Content.ReadAsStringAsync().Result; } //post 提交 先创建一个和webapi对应的类 content = new FormUrlEncodedContent( new Dictionary< string , string >() { { "Id" , "382accff-57b2-4d6e-ae84-a61e00a3e3b5" }, { "Name" , "Name" }, { "Category" , "111" }, { "Price" , "1" } }); response = myHttpClient.PostAsync( "api/ProductsAPI/PostProduct" , content).Result; if (response.IsSuccessStatusCode) { result = response.Content.ReadAsStringAsync().Result; } //delete 提交 response = myHttpClient.DeleteAsync( "api/ProductsAPI/DeleteProduct/1" ).Result; if (response.IsSuccessStatusCode) { result = response.Content.ReadAsStringAsync().Result; } //GET提交 返回List<class> response = myHttpClient.GetAsync( "api/ProductsAPI/GetAllProducts" ).Result; List<Product> listproduct = new List<Models.Product>(); if (response.IsSuccessStatusCode) { listproduct = response.Content.ReadAsAsync<List<Product>>().Result; } return Content(JsonConvert.SerializeObject(listproduct)); |
/// <summary> /// url请求 /// </summary> /// <param name="type"></param> /// <param name="paramData"></param> /// <returns></returns> private static string WebRequest(string method, string type, string paramData) { string apiUrl = "http://" + ConfigHelper.GetBaseUrl("url") + "/Session"; apiUrl = apiUrl.EndsWith("/") ? apiUrl : apiUrl + "/"; string postUrl = string.Empty; if (type == "Get" || type == "Delete") { postUrl = apiUrl + method + "?" + paramData; } else { postUrl = apiUrl + method; } LogWriter.ToDebug(postUrl); string ret = string.Empty; byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(paramData); System.Net.HttpWebRequest webReq = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(new Uri(postUrl)); webReq.Method = type; switch (type) { case "Post": { webReq.ContentLength = byteArray.Length; webReq.ContentType = "application/json"; System.IO.Stream newStream = webReq.GetRequestStream(); newStream.Write(byteArray, 0, byteArray.Length); //写入参数 newStream.Close(); } break; case "Put": { webReq.ContentLength = byteArray.Length; webReq.ContentType = "application/x-www-form-urlencoded"; System.IO.Stream newStream = webReq.GetRequestStream(); newStream.Write(byteArray, 0, byteArray.Length); //写入参数 newStream.Close(); } break; } using (System.Net.HttpWebResponse response = (System.Net.HttpWebResponse)webReq.GetResponse()) { System.IO.StreamReader sr = new System.IO.StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8); ret = sr.ReadToEnd(); sr.Close(); } return ret; }
c#调用webapi post list 折腾了半天,最后用这种方式解决了。上面那种还是不会。 //请求路径 string url = "http://localhost:3063/api/Blog/SetTopNo"; //定义request并设置request的路径 WebRequest request = WebRequest.Create(url); request.Method = "post"; //初始化request参数 string postData = "[{\"TopNo\": \"22\",\"CategoryId\": \"1\",\"BlogId\": \"1723\"}, {\"TopNo\": \"12\",\"CategoryId\": \"2\",\"BlogId\":\"1723\"}]"; //设置参数的编码格式,解决中文乱码 byte[] byteArray = Encoding.UTF8.GetBytes(postData); //设置request的MIME类型及内容长度 request.ContentType = "application/json"; request.ContentLength = byteArray.Length; //打开request字符流 Stream dataStream = request.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); dataStream.Close(); //定义response为前面的request响应 WebResponse response = request.GetResponse();
问题:c#后台调用webapi接口,后面用webrequest虽然解决了传复杂类型的问题,但是写起来麻烦,还是想用httpclient,经过打断点查看header,查阅资料,加班终于搞定
var postData = new { Title = title, Content = JsonConvert.SerializeObject(contentJson), PublishFlag = "0",//发布标记:1已发布,0未发布 跟游记保持一至 LongArticle = longArticle,//复杂类型 }; var content = new StringContent(JsonConvert.SerializeObject(postData));//用的StringContent 之前用的FormUrlEncodedContent content.Headers.ContentType = new MediaTypeHeaderValue("application/json");//关键 HttpClient httpClient = GetUseHttpClient(); //编辑,新增接口不一样 var url = "api/Blog/PublishLongArticle"; if (request.blogid!=null&&request.blogid.Trim().Length > 0) { url = "api/Blog/EditLongArticle"; } var apiResponse = httpClient.PostAsync(url, content).Result; if (apiResponse.IsSuccessStatusCode)