从调用API接口 看.net framework和 net core的异同
2017-05-05 14:21
211 查看
由于.net core是跨平台使用的,所有微软重写好多API,由此有些差异也是正常的。
现在就来看下请求API的差别吧。
首先,原本的.net framework请求方法:
第一种返回错误编码的.net core的写法:
View Code
查看下.net core下的属性和方法:
可以明显发现比.net framwork下少了好多。
也就是.net core的请求类型,更趋于向浏览器的请求头靠拢,也就是使用Headers字典(.net framwork下也有,但是同层级也会有一些属性,比如采用压缩)。
主要的区别就是 响应流 采用的是异步的方式,而.net framwork采用同步的方式,必须手动close(),而新的写法,就只能用using了。
但是,上述的这个方法,害死人了,请求也成功,就是编码始终调试不对,请求各位大神指点一二。
由于水平问题,未能解决上述问题,所以小弟采用.net core的 HttpClientHandler 类进行http请求:
get方法
post请求
现在就来看下请求API的差别吧。
首先,原本的.net framework请求方法:
public static T HttpPostWithDecompression<T>(string request, string url, int timeout) where T : new() { var httpWebRequest = (HttpWebRequest)WebRequest.Create(url); httpWebRequest.Proxy = null; httpWebRequest.Timeout = timeout; httpWebRequest.Method = "POST"; httpWebRequest.ContentType = "application/json"; httpWebRequest.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; var bytes = Encoding.UTF8.GetBytes(request); Stream requestStream = null; var responseContent = string.Empty; try { requestStream = httpWebRequest.GetRequestStream(); requestStream.Write(bytes, 0, bytes.Length); var webResponse = httpWebRequest.GetResponse(); var stream = webResponse.GetResponseStream(); if (stream != null) { var streamReader = new StreamReader(stream); responseContent = streamReader.ReadToEnd(); streamReader.Close(); } webResponse.Close(); return JsonConvert.DeserializeObject<T>(responseContent); } catch (Exception exception) { return new T(); } finally { if (requestStream != null) { requestStream.Close(); } } }
第一种返回错误编码的.net core的写法:
public async static Task<T> HttpPostWithDecompression<T>(string request, string url, int timeout) where T : new() { var httpWebRequest = (HttpWebRequest)WebRequest.Create(url); httpWebRequest.Proxy = null; httpWebRequest.ContinueTimeout = timeout; httpWebRequest.Method = "POST"; httpWebRequest.ContentType = "application/json"; httpWebRequest.Headers["Accept-Encoding"] = "gzip,deflate"; //httpWebRequest.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip; var data = Encoding.UTF8.GetBytes(request); using (var requestStream = await httpWebRequest.GetRequestStreamAsync())//释放 { requestStream.Write(data, 0, data.Length); } string result = string.Empty; //响应流 using (var response = (HttpWebResponse)await httpWebRequest.GetResponseAsync()) { Stream responseStream = null; if (response.StatusCode == HttpStatusCode.OK) { responseStream = response.GetResponseStream(); if (responseStream != null) { var streamReader = new StreamReader(responseStream, Encoding.UTF8); //获取返回的信息 result = streamReader.ReadToEnd(); return JsonConvert.DeserializeObject<T>(result); } } } return new T(); }
View Code
查看下.net core下的属性和方法:
可以明显发现比.net framwork下少了好多。
也就是.net core的请求类型,更趋于向浏览器的请求头靠拢,也就是使用Headers字典(.net framwork下也有,但是同层级也会有一些属性,比如采用压缩)。
主要的区别就是 响应流 采用的是异步的方式,而.net framwork采用同步的方式,必须手动close(),而新的写法,就只能用using了。
但是,上述的这个方法,害死人了,请求也成功,就是编码始终调试不对,请求各位大神指点一二。
由于水平问题,未能解决上述问题,所以小弟采用.net core的 HttpClientHandler 类进行http请求:
get方法
/// <summary> /// get请求 /// </summary> /// <param name="url">url包含参数</param> public static async Task<T> doGet<T>(string url) where T : new() { var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip }; using (var http = new HttpClient(handler)) { var response = await http.GetAsync(url); //确保HTTP成功状态值 response.EnsureSuccessStatusCode(); string responseStr =response.Content.ReadAsStringAsync().Result; return JsonConvert.DeserializeObject<T>(responseStr); } }
post请求
/// <summary> /// post请求 /// </summary> /// <param name="url">url包含参数</param> public async static Task<T> HttpPostWithDecompression<T>(string request, string apiUrl, int timeout) where T : new() { HttpClientHandler handler = new HttpClientHandler(); handler.Proxy = null; handler.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; var data = Encoding.UTF8.GetBytes(request); using (var httpClient = new HttpClient(handler)) { httpClient.BaseAddress = new Uri(apiUrl); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var cont = new StringContent(request); //var content = new FormUrlEncodedContent(JsonConvert.DeserializeObject<Dictionary<string, string>>(request)); //被上面这个注释掉的代码,这种偷懒转Dic的方式给坑苦了,不能这么用啊!!! var response = await httpClient.PostAsync(apiUrl, cont); string result = response.Content.ReadAsStringAsync().Result; return JsonConvert.DeserializeObject<T>(result); } }
相关文章推荐
- 调用腾讯的API接口
- 如何调用EcStore中的API接口
- Saltstack的API接口与调用方式
- 新浪网易IP地区信息查询API接口调用方法
- 简析.NET Core 以及与 .NET Framework的关系
- java web api接口调用
- 使用Spring AOP处理API接口调用日志出现问题(暂未解决)
- 远程调用 api接口 post
- 系统调用与库函数的异同
- 中断调用和子程序的调用的异同
- 一篇很好的解释了.Net Core, .Net Framework, .Net standard library, Xamarin 之间关系的文章 (转载)
- 如何调用EcStore中的API接口
- .net framework 4.5 +steeltoe+ springcloud(二) 实现服务发现与调用功能
- python调用zabbix的api接口添加主机、查询组、主机、模板
- [置顶] 调用百度地图显示周围方圆100米、500米、1000米附近的餐馆宾馆酒店及公交站点API接口
- vb调用winInet API接口post数据到指定的url
- JavaScript:new 一个函数和直接调用函数的异同
- 远程调用 api接口 post
- 程序集(CLR)调用web service出现"在执行用户定义历城或聚合期间出现.net framework错误,索引(从零开始必须大于或等于零,且小于参数列表的大小)"
- ASP.NET调用新浪微博开放平台API接口的代码示例