HttpClient替换HttpWebRequest--以GET和POST请求为例说明
首先说一下HttpRequest、WebClient和HttpClient的关系:HttpRequest是基层的请求方式,WebClient是对HttpRequest的简化封装,在WebClient中有对HttpRequest的默认设置;HttpClient是重写的请求方式,相对于HttpRequest更简单实现异步请求,是.NetCore中更推崇的方式。
说明:以下代码中 在GetAccessToken(Async)中调用了调用了PostMail(Async)方式,其中在GetAccessToken(Async)实现GET请求,在PostMail(Async)中实现POST请求
一、对比一下HttpRequest与HttpClient实现GET请求的过程区别(其实很相似,但HttpClient轻松实现了异步)
1)HttpRequest的GET请求
public ActionResult<string> GetAccessToken()
{ //GET获取accessToken的参数 corid
string uri = "你的URL";
//创建请求
//HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
//WebClient是对HttpWebRequest的抽象,WebClient使用简单,但速度慢;Restsharp兼具WebClient和HttpWebClient的优点;HttpClient是.NetCore中的概念,更适合异步编程
WebRequest request = WebRequest.Create(uri);
//请求设置
request.Credentials = CredentialCache.DefaultCredentials;
//创建应答接收
WebResponse response = request.GetResponse();
//创建应答读写流
string accessToken;
using (Stream streamResponse=response.GetResponseStream())
{
StreamReader reader = new StreamReader(streamResponse);
string responseFromServer = reader.ReadToEnd();
JObject res = (JObject)JsonConvert.DeserializeObject(responseFromServer);
accessToken = res["access_token"].ToString();
reader.Close();
}
//获得许可证凭证
PostMail(accessToken);
//关闭响应
response.Close();
return "success";
}
2)HttpClient的GET请求
public async Task<ActionResult<string>> GetAccessTokenAsync()
{
string uri = "你的URL";
HttpClientHandler handler = new HttpClientHandler
{
//设置是否发送凭证信息,有的服务器需要验证身份,不是所有服务器需要
UseDefaultCredentials = false };
HttpClient httpClient = new HttpClient(handler);
HttpResponseMessage response = await httpClient.GetAsync(uri);
response.EnsureSuccessStatusCode();
string accessToken;
//回复结果直接读成字符串
string resp = await response.Content.ReadAsStringAsync();
JObject json = (JObject)JsonConvert.DeserializeObject(resp);
accessToken = json["access_token"].ToString();
//采用流读数据
//using (Stream streamResponse = await response.Content.ReadAsStreamAsync())
//{
// StreamReader reader = new StreamReader(streamResponse);
// string responseFromServer = reader.ReadToEnd();
// JObject res = (JObject)JsonConvert.DeserializeObject(responseFromServer);
// accessToken = res["access_token"].ToString();
// reader.Close();
//}
//获得许可证凭证
PostMailAsync(accessToken);
//关闭响应
return "success";
}
二、对比一下HttpRequest与HttpClient实现POST请求的过程区别
1)HttpRequest的POST请求
public void PostMail(string accessToken)
{ //POST的API
string uri = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + accessToken;
//创建请求
WebRequest myWebRequest = WebRequest.Create(uri);
//请求设置
myWebRequest.Credentials = CredentialCache.DefaultCredentials;
myWebRequest.ContentType = "application/json;charset=UTF-8";
myWebRequest.Method = "POST";
//向服务器发送的内容
using (Stream streamResponse = myWebRequest.GetRequestStream())
{
//创建JSON格式的发送内容
JObject postedJObject = new JObject
{
//在此处设置发送内容及对象
{ "touser", "Heavy" },
{ "msgtype", "text" },
{ "agentid", }
};
JObject text = new JObject
{
{"content","内容来自网站--内容可自行编辑--heavy"}
};
postedJObject.Add("text", text);
postedJObject.Add("safe", );
//将传送内容编码
String paramString = postedJObject.ToString(Newtonsoft.Json.Formatting.None, null);
byte[] byteArray = Encoding.UTF8.GetBytes(paramString);
//向请求中写入内容
streamResponse.Write(byteArray, , byteArray.Length);
}
//创建应答
WebResponse myWebResponse = myWebRequest.GetResponse();
//创建应答的读写流
string responseFromServer;
using (Stream streamResponse = myWebResponse.GetResponseStream())
{
StreamReader streamRead = new StreamReader(streamResponse);
responseFromServer = streamRead.ReadToEnd();
}
//关闭应答
myWebResponse.Close();
}
2)HttpClient的POST请求
public async void PostMailAsync(string accessToken)
{
string uri = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + accessToken;
HttpClientHandler handler = new HttpClientHandler
{
UseDefaultCredentials = true, };
HttpClient httpClient = new HttpClient(handler);
JObject postedJObject = new JObject
{
//在此处设置发送内容及对象
{ "touser", "Heavy" },
{ "msgtype", "text" },
{ "agentid", }
};
JObject text = new JObject
{
{"content","内容来自网站--内容可自行编辑--heavy"}
};
postedJObject.Add("text", text);
postedJObject.Add("safe", );
//将传送内容编码
String paramString = postedJObject.ToString(Newtonsoft.Json.Formatting.None, null);
//byte[] byteArray = Encoding.UTF8.GetBytes(paramString);
HttpContent httpContent = new StringContent(paramString,Encoding.UTF8,"application/json");
HttpResponseMessage response = await httpClient.PostAsync(uri, httpContent);
//用来判断是否接收成功,否则抛出异常
response.EnsureSuccessStatusCode();
}
HttpClient替换HttpWebRequest--以GET和POST请求为例说明的更多相关文章
- NET 5 使用HttpClient和HttpWebRequest
HttpWebRequest 这是.NET创建者最初开发用于使用HTTP请求的标准类.HttpWebRequest是老版本.net下常用的,较为底层且复杂,访问速度及并发也不甚理想,但是使用HttpW ...
- 在ASP.NET Core中用HttpClient(三)——发送HTTP PATCH请求
在前面的两篇文章中,我们讨论了很多关于使用HttpClient进行CRUD操作的基础知识.如果你已经读过它们,你就知道如何使用HttpClient从API中获取数据,并使用HttpClient发送PO ...
- 如何使用HttpClient来发送带客户端证书的请求,以及如何忽略掉对服务器端证书的校验
最近要做客户端和服务器端的双向认证,在客户端向服务器端发送带证书的请求这里有一点问题,网上的例子大多都不太好使,于是找了github上httpclient源代码中的例子改造了一下,终于弄明白了 git ...
- httpclient开启代理,获取java中请求的url
背景:在httpclent做post或者get请求时,请求返回的数据总是和预想的不一致,但是有不知道怎么排查问题,经同事说httpclient可以设置代理,就可以获取请求前数据的一些问题,帮助我排查问 ...
- httpclient连接池在ES Restful API请求中的应用
package com.wm.utils; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http ...
- c# HttpClient和HttpWebRequest添加Basic类型的Authentication认证
c#项目中用到调用客户接口,basic身份认证,base64格式加密(用户名:密码)贴上代码以备后用 1.使用HttpClient实现basic身份认证 using (HttpClient clien ...
- 如何选择 WebClient,HttpClient,HttpWebRequest
当我们在用 .NET 调用 RestAPI 时通常有三种选择,分别为:WebClient, HttpWebRequest,HttpClient,这篇文章我们将会讨论如何使用这三种方式去调用 RestA ...
- 十二、.net core(.NET 6)添加通用的访问webapi的方法(包括HttpClient和HttpWebRequest)
开发通用的访问webapi方法. 在common工具文件夹下,新建一个类库项目:Wsk.Core.WebHelper,并引用Package包项目,然后新建一个类HttpClientHelper,用于使 ...
- HttpClient与APS.NET Web API:请求内容的压缩与解压
首先说明一下,这里的压缩与解压不是通常所说的http compression——那是响应内容在服务端压缩.在客户端解压,而这里是请求内容在客户端压缩.在服务端解压. 对于响应内容的压缩,一般Web服务 ...
随机推荐
- FSB总线、HT总线、QPI总线、DMI总线
http://wenku.baidu.com/link?url=d0NQFyvVpU--FpQUIjkPcdE036riitKgKib3385qr7VdB1oNUcIDpRndY-HH4ITjzJln ...
- U盘 文件被隐藏解决办法
原地址:http://www.deyi.com/thread-351635-1-1.html 方法:运行cmd( 在任意目录都行)单个文件 :attrib c:\"要修改的文件夹名字&quo ...
- requirejs中的define
关于requirejs中的define的原理理解 我们已经了解到模块模式是为单例创建私有变量和特权方法的.一个最基本的例子: var foo=(function(){ var something= ...
- 诊断并解决 ORA-4030 错误 (Doc ID 1548826.1)
适用于: Oracle Database - Enterprise Edition - 版本号 8.1.7.4 和更高版本号 本文档所含信息适用于全部平台 用途 怎样诊断 ORA-4030 错误 排错 ...
- C++结构体中使用函数与类中使用函数小结
#include <iostream>#include <string.h>using namespace std;struct stud//学生信息结构体{ char ...
- ios+Appium+Java
To run iOS tests, you can follow these steps : (Note : I am using Java language here in Eclipse IDE ...
- mac系统不同java版本切换
#确认jdk版本 /usr/libexec/java_home #会得到下面信息(不同版本显示不一样) /Library/Java/JavaVirtualMachines/jdk1.7.0_60.jd ...
- sanic官方文档解析之Response和Cookie
1,Sanic的返回的响应体 使用Sanic中的response模块去创建响应对象 返回文本response.text文本(直接字符串就ok) 返回html文件,直接response.html文件(类 ...
- Axure Base 07 元件使用思路的补充
我们曾经对axure线框图基本元件进行过说明,现结合这我对这些元件的使用习惯,对部分元件的使用,再做一些补充. 1. 图片:可以编辑悬停.按下时候显示不同的图片,做图片的一些特殊效果. 2. 文本(l ...
- nodejs的request模块
request模块让http请求变的更加简单.(作为客户端,去请求.抓取另一个网站的信息) request的GitHub主页: https://github.com/request/request 最 ...