详解c# .net core 下的网络请求
本文章是在VS2017的环境下,.netcore1.1版本以上。
在这期间,由于.netcore并不基于IIS,我们的过去的网络请求代码在.netcore框架下,有可能会出现不兼容,报错的现象。这里大致介绍下在.netcore下如何进行http请求,主要仍然是GET和POST方法,有错误的地方,欢迎指正!
先来说POST,POST我实现了三种方法,前两种基于的原理是完全一致的,后面的有些小小的差异,但他们的本质都是http请求,本质上是无区别的,只是实现方法有所不同。
废话不多说,上代码:
POST异步方法:
//////异步请求post(键值对形式,可等待的) /// ///网络基址("http://localhost:59315") /// 网络的地址("/api/UMeng") /// 键值对List >formData=newList >();formData.Add(newKeyValuePair ("userid","29122"));formData.Add(newKeyValuePair ("umengids","29122")); /// 编码格式 /// 头媒体类型 /// publicasyncTask HttpPostAsync(stringuri,stringurl,List >formData=null,stringcharset="UTF-8",stringmediaType="application/x-www-form-urlencoded") { stringtokenUri=url; varclient=newHttpClient(); client.BaseAddress=newUri(uri); HttpContentcontent=newFormUrlEncodedContent(formData); content.Headers.ContentType=newMediaTypeHeaderValue(mediaType); content.Headers.ContentType.CharSet=charset; for(inti=0;i POST同步方法:
//////同步请求post(键值对形式) /// ///网络基址("http://localhost:59315") /// 网络的地址("/api/UMeng") /// 键值对List >formData=newList >();formData.Add(newKeyValuePair ("userid","29122"));formData.Add(newKeyValuePair ("umengids","29122")); /// 编码格式 /// 头媒体类型 /// publicstringHttpPost(stringuri,stringurl,List >formData=null,stringcharset="UTF-8",stringmediaType="application/x-www-form-urlencoded") { stringtokenUri=url; varclient=newHttpClient(); client.BaseAddress=newUri(uri); HttpContentcontent=newFormUrlEncodedContent(formData); content.Headers.ContentType=newMediaTypeHeaderValue(mediaType); content.Headers.ContentType.CharSet=charset; for(inti=0;i 遗憾的是,同步方法也是基于异步实现的,个人认为这样做会加大系统开销。如果各位有其他的高效实现,请不吝赐教!
接下来是通过流的方式进行POST:
publicstringPost(stringurl,stringdata,Encodingencoding,inttype) { try { HttpWebRequestreq=WebRequest.CreateHttp(newUri(url)); if(type==1) { req.ContentType="application/json;charset=utf-8"; } elseif(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); StreamreqStream=req.GetRequestStreamAsync().Result; reqStream.Write(postData,0,postData.Length); reqStream.Dispose(); varrsp=(HttpWebResponse)req.GetResponseAsync().Result; varresult=GetResponseAsString(rsp,encoding); returnresult; } catch(Exceptionex) { throw; } }privatestringGetResponseAsString(HttpWebResponsersp,Encodingencoding) { Streamstream=null; StreamReaderreader=null; try { //以字符流的方式读取HTTP响应 stream=rsp.GetResponseStream(); reader=newStreamReader(stream,encoding); returnreader.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中的内容 /// publicstaticasyncTask HttpGetAsync(stringurl,List >formData=null) { HttpClienthttpClient=newHttpClient(); HttpContentcontent=newFormUrlEncodedContent(formData); if(formData!=null) { content.Headers.ContentType=newMediaTypeHeaderValue("application/x-www-form-urlencoded"); content.Headers.ContentType.CharSet="UTF-8"; for(inti=0;i //////同步get请求 /// ///链接地址 /// 写在header中的键值对 /// publicstringHttpGet(stringurl,List >formData=null) { HttpClienthttpClient=newHttpClient(); HttpContentcontent=newFormUrlEncodedContent(formData); if(formData!=null) { content.Headers.ContentType=newMediaTypeHeaderValue("application/x-www-form-urlencoded"); content.Headers.ContentType.CharSet="UTF-8"; for(inti=0;i temp=resp.Content.ReadAsStringAsync(); temp.Wait(); returntemp.Result; } 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。