詳解c# .net core 下的網(wǎng)絡(luò)請(qǐng)求
本文章是在VS2017的環(huán)境下,.net core 1.1版本以上。
在這期間,由于.net core 并不基于IIS,我們的過去的網(wǎng)絡(luò)請(qǐng)求代碼在.net core框架下,有可能會(huì)出現(xiàn)不兼容,報(bào)錯(cuò)的現(xiàn)象。這里大致介紹下在.net core 下如何進(jìn)行http請(qǐng)求,主要仍然是GET和POST方法,有錯(cuò)誤的地方,歡迎指正!
先來說POST,POST我實(shí)現(xiàn)了三種方法,前兩種基于的原理是完全一致的,后面的有些小小的差異,但他們的本質(zhì)都是http請(qǐng)求,本質(zhì)上是無區(qū)別的,只是實(shí)現(xiàn)方法有所不同。
廢話不多說,上代碼:
POST異步方法:
/// <summary>
/// 異步請(qǐng)求post(鍵值對(duì)形式,可等待的)
/// </summary>
/// <param name="uri">網(wǎng)絡(luò)基址("http://localhost:59315")</param>
/// <param name="url">網(wǎng)絡(luò)的地址("/api/UMeng")</param>
/// <param name="formData">鍵值對(duì)List<KeyValuePair<string, string>> formData = new List<KeyValuePair<string, string>>();formData.Add(new KeyValuePair<string, string>("userid", "29122"));formData.Add(new KeyValuePair<string, string>("umengids", "29122"));</param>
/// <param name="charset">編碼格式</param>
/// <param name="mediaType">頭媒體類型</param>
/// <returns></returns>
public async Task<string> HttpPostAsync(string uri, string url, List<KeyValuePair<string, string>> formData = null, string charset = "UTF-8", string mediaType = "application/x-www-form-urlencoded")
{
string tokenUri = url;
var client = new HttpClient();
client.BaseAddress = new Uri(uri);
HttpContent content = new FormUrlEncodedContent(formData);
content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
content.Headers.ContentType.CharSet = charset;
for (int i = 0; i < formData.Count; i++)
{
content.Headers.Add(formData[i].Key, formData[i].Value);
}
HttpResponseMessage resp = await client.PostAsync(tokenUri, content);
resp.EnsureSuccessStatusCode();
string token = await resp.Content.ReadAsStringAsync();
return token;
}
POST同步方法:
/// <summary>
/// 同步請(qǐng)求post(鍵值對(duì)形式)
/// </summary>
/// <param name="uri">網(wǎng)絡(luò)基址("http://localhost:59315")</param>
/// <param name="url">網(wǎng)絡(luò)的地址("/api/UMeng")</param>
/// <param name="formData">鍵值對(duì)List<KeyValuePair<string, string>> formData = new List<KeyValuePair<string, string>>();formData.Add(new KeyValuePair<string, string>("userid", "29122"));formData.Add(new KeyValuePair<string, string>("umengids", "29122"));</param>
/// <param name="charset">編碼格式</param>
/// <param name="mediaType">頭媒體類型</param>
/// <returns></returns>
public string HttpPost(string uri, string url, List<KeyValuePair<string, string>> formData = null, string charset = "UTF-8", string mediaType = "application/x-www-form-urlencoded")
{
string tokenUri = url;
var client = new HttpClient();
client.BaseAddress = new Uri(uri);
HttpContent content = new FormUrlEncodedContent(formData);
content.Headers.ContentType = new MediaTypeHeaderValue(mediaType);
content.Headers.ContentType.CharSet = charset;
for (int i = 0; i < formData.Count; i++)
{
content.Headers.Add(formData[i].Key, formData[i].Value);
}
var res = client.PostAsync(tokenUri, content);
res.Wait();
HttpResponseMessage resp = res.Result;
var res2 = resp.Content.ReadAsStringAsync();
res2.Wait();
string token = res2.Result;
return token;
}遺憾的是,同步方法也是基于異步實(shí)現(xiàn)的,個(gè)人認(rèn)為這樣做會(huì)加大系統(tǒng)開銷。如果各位有其他的高效實(shí)現(xiàn),請(qǐng)不吝賜教!
接下來是通過流的方式進(jìn)行POST:
public string Post(string url, string data, Encoding encoding, int type)
{
try
{
HttpWebRequest req = WebRequest.CreateHttp(new Uri(url));
if (type == 1)
{
req.ContentType = "application/json;charset=utf-8";
}
else if (type == 2)
{
req.ContentType = "application/xml;charset=utf-8";
}
else
{
req.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
}
req.Method = "POST";
//req.Accept = "text/xml,text/javascript";
req.ContinueTimeout = 60000;
byte[] postData = encoding.GetBytes(data);
Stream reqStream = req.GetRequestStreamAsync().Result;
reqStream.Write(postData, 0, postData.Length);
reqStream.Dispose();
var rsp = (HttpWebResponse)req.GetResponseAsync().Result;
var result = GetResponseAsString(rsp, encoding);
return result;
}
catch (Exception ex)
{
throw;
}
}
private string GetResponseAsString(HttpWebResponse rsp, Encoding encoding)
{
Stream stream = null;
StreamReader reader = null;
try
{
// 以字符流的方式讀取HTTP響應(yīng)
stream = rsp.GetResponseStream();
reader = new StreamReader(stream, encoding);
return reader.ReadToEnd();
}
finally
{
// 釋放資源
if (reader != null) reader.Dispose();
if (stream != null) stream.Dispose();
if (rsp != null) rsp.Dispose();
}
}
這種方式的POST還是將數(shù)據(jù)寫入到流里面,進(jìn)行POST,之所以寫前兩個(gè)key-value的形式,是為了符合java或者oc的風(fēng)格,在c#書寫的webapi中,由于接收形式是{=value}而不是{key=value}(由webapi的性質(zhì)決定),后續(xù)我會(huì)說如何在webapi中接收(key-value)的形式,適當(dāng)避免.net后臺(tái)人員與android和ios的矛盾
接下來是get,同樣同步異步都是由異步實(shí)現(xiàn)的,還請(qǐng)各位看官輕噴。
GET:
/// <summary>
/// 異步請(qǐng)求get(UTF-8)
/// </summary>
/// <param name="url">鏈接地址</param>
/// <param name="formData">寫在header中的內(nèi)容</param>
/// <returns></returns>
public static async Task<string> HttpGetAsync(string url, List<KeyValuePair<string, string>> formData = null)
{
HttpClient httpClient = new HttpClient();
HttpContent content = new FormUrlEncodedContent(formData);
if (formData != null)
{
content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
content.Headers.ContentType.CharSet = "UTF-8";
for (int i = 0; i < formData.Count; i++)
{
content.Headers.Add(formData[i].Key, formData[i].Value);
}
}
var request = new HttpRequestMessage()
{
RequestUri = new Uri(url),
Method = HttpMethod.Get,
};
for (int i = 0; i < formData.Count; i++)
{
request.Headers.Add(formData[i].Key, formData[i].Value);
}
var resp = await httpClient.SendAsync(request);
resp.EnsureSuccessStatusCode();
string token = await resp.Content.ReadAsStringAsync();
return token;
}
/// <summary>
/// 同步get請(qǐng)求
/// </summary>
/// <param name="url">鏈接地址</param>
/// <param name="formData">寫在header中的鍵值對(duì)</param>
/// <returns></returns>
public string HttpGet(string url, List<KeyValuePair<string, string>> formData = null)
{
HttpClient httpClient = new HttpClient();
HttpContent content = new FormUrlEncodedContent(formData);
if (formData != null)
{
content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");
content.Headers.ContentType.CharSet = "UTF-8";
for (int i = 0; i < formData.Count; i++)
{
content.Headers.Add(formData[i].Key, formData[i].Value);
}
}
var request = new HttpRequestMessage()
{
RequestUri = new Uri(url),
Method = HttpMethod.Get,
};
for (int i = 0; i < formData.Count; i++)
{
request.Headers.Add(formData[i].Key, formData[i].Value);
}
var res = httpClient.SendAsync(request);
res.Wait();
var resp = res.Result;
Task<string> temp = resp.Content.ReadAsStringAsync();
temp.Wait();
return temp.Result;
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ASP.NET(C#) String, StringBuilder 與 StringWriter性能比較
ASP.NET(C#) String, StringBuilder 與 StringWriter性能比較...2007-08-08
MVC+EasyUI+三層新聞網(wǎng)站建立 詳情頁(yè)面制作方法(八)
這篇文章主要為大家詳細(xì)介紹了MVC+EasyUI+三層新聞網(wǎng)站建立的第八篇,教大家如何制作詳情頁(yè)面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
ASP.NET?Core中引用OpenAPI服務(wù)的添加示例
這篇文章主要為大家介紹了ASP.NET?Core中引用OpenAPI服務(wù)添加示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-04-04
.net?6?配置QuartZ定時(shí)任務(wù)的過程
這篇文章主要介紹了.net?6?配置QuartZ定時(shí)任務(wù)的過程,在VS2022中,通過Nuget包管理器安裝Quartz?3.8.1 ,這是.net 6 依賴的最高版本,在此記錄學(xué)習(xí)一下,需要的朋友可以參考下2024-04-04
詳解如何在ASP.NET Core中應(yīng)用Entity Framework
本篇文章主要介紹了如何在ASP.NET Core中應(yīng)用Entity Framework,具有一定的參考價(jià)值,有興趣的可以一起了解一下。2016-12-12

