WebApi(6) 后台C#調用WebApi


https://www.cnblogs.com/cxd1008/p/6640015.html

今天來寫一下后台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)

  

 

本文為博主原創文章,歡迎轉載,但轉載須注在明顯位置注明【博客地址】和【原文地址】,否則將追究法律責任。http://www.cnblogs.com/cxd1008


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM