博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c# .net core 下的网络请求
阅读量:6976 次
发布时间:2019-06-27

本文共 7328 字,大约阅读时间需要 24 分钟。

本文章是在VS2017的环境下,.net core 1.1版本以上。

在这期间,由于.net core 并不基于IIS,我们的过去的网络请求代码在.net core框架下,有可能会出现不兼容,报错的现象。这里大致介绍下在.net core 下如何进行http请求,主要仍然是GET和POST方法,有错误的地方,欢迎指正!

先来说POST,POST我实现了三种方法,前两种基于的原理是完全一致的,后面的有些小小的差异,但他们的本质都是http请求,本质上是无区别的,只是实现方法有所不同。

废话不多说,上代码:

POST异步方法:

///         /// 异步请求post(键值对形式,可等待的)        ///         /// 网络基址("http://localhost:59315")        /// 网络的地址("/api/UMeng")        /// 键值对List
> formData = new List
>();formData.Add(new KeyValuePair
("userid", "29122"));formData.Add(new KeyValuePair
("umengids", "29122")); ///
编码格式 ///
头媒体类型 ///
public async Task
HttpPostAsync(string uri, string url, List
> 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同步方法:

///         /// 同步请求post(键值对形式)        ///         /// 网络基址("http://localhost:59315")        /// 网络的地址("/api/UMeng")        /// 键值对List
> formData = new List
>();formData.Add(new KeyValuePair
("userid", "29122"));formData.Add(new KeyValuePair
("umengids", "29122")); ///
编码格式 ///
头媒体类型 ///
public string HttpPost(string uri, string url, List
> 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; }

遗憾的是,同步方法也是基于异步实现的,个人认为这样做会加大系统开销。如果各位有其他的高效实现,请不吝赐教!

接下来是通过流的方式进行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响应                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还是将数据写入到流里面,进行POST,之所以写前两个key-value的形式,是为了符合java或者oc的风格,在c#书写的webapi中,由于接收形式是{=value}而不是{key=value}(由webapi的性质决定),后续我会说如何在webapi中接收(key-value)的形式,适当避免.net后台人员与android和ios的矛盾,从而达到社会主义民主社会的长治久安。

接下来是get,同样同步异步都是由异步实现的,还请各位看官轻喷。

GET:

///         /// 异步请求get(UTF-8)        ///         /// 链接地址               /// 写在header中的内容        /// 
public static async Task
HttpGetAsync(string url, List
> 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; }

 

///         /// 同步get请求        ///         /// 链接地址               /// 写在header中的键值对        /// 
public string HttpGet(string url, List
> 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
temp = resp.Content.ReadAsStringAsync(); temp.Wait(); return temp.Result; }

以上就是这样吧,还有,我是一个经不起批评的人,如果你批评我,我就骂你(玩笑)。请大家不吝赐教!感谢

 

转载于:https://www.cnblogs.com/lsnct/p/6890748.html

你可能感兴趣的文章
创建quickstart报错
查看>>
四则运算2程序及运行结果
查看>>
【参考】Linux下的Memcache安装
查看>>
pg存储过程和sql语句块
查看>>
c语言中getchar的用法
查看>>
JavaScript对象继承方式与优缺点
查看>>
javascrpt 类详解 面向对象
查看>>
POJ3671 Dining Cows
查看>>
UVa10214 Trees in a Wood.
查看>>
使用WebBrowser控件播放Flash网页相关问题解决方法(转)
查看>>
UVA - 10815 - Andy's First Dictionary STL
查看>>
清除SQL server 记住的用户名和密码
查看>>
URL 字符编码
查看>>
[vijos P1023] Victoria的舞会3
查看>>
C ++模板的声明和实现为何要放在头文件中?
查看>>
keychains
查看>>
混频器
查看>>
系统利益相关者描述
查看>>
IDENTITY
查看>>
unity3d游戏开发学习分享之表面着色器讲解
查看>>