创建HttpClient
定义
命名空间:TouchSocket.Http
程序集:TouchSocket.Http.dll
一、说明
HttpClient是Http客户端类。主要用于请求Http报文。与.net的HttpClient不同的是,此处的HttpClient,是基于单个连接的客户端,且有明显的连接、断开连接等动作。
二、可配置项
继承TcpClient
三、支持插件接口
支持ITcpPlugin接口。
四、创建HttpClient
4.1 创建常规HttpClient
var client = new HttpClient();
await client.ConnectAsync("http://localhost:7219");//先做连接
4.2 创建Ssl的HttpClient(Https)
var client = new HttpClient();
await client.ConnectAsync("https://localhost:7219");//先做连接
如果是自定义证书,则需要手动加载证书
var client = new HttpClient();
var config = new TouchSocketConfig();
config.SetRemoteIPHost("https://localhost:7219")
.SetClientSslOption(new ClientSslOption()
{
ClientCertificates = new X509CertificateCollection() { new X509Certificate2("Socket.pfx", "Socket") },
SslProtocols = SslProtocols.Tls12,
TargetHost = "localhost",
CertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => { return true; }
}); ;
//配置config
await client.SetupAsync(config);
await client.ConnectAsync();//先做连接
备注
实际上直接使用ConnectAsync("https://localhost:7219")
的方式是合并了SetupAsync
与ConnectAsync
。所以当需要额外配置时,应当遵循所有配置都在TouchSocketConfig
的约定。这样代码也比较简单明了。
五、发送请求
因为我的HttpClient是面向连接的,所以,在请求时,请求url只需要填写host之后的部分即可(即路由部分)。
5.1 发起Get请求到字符串
//直接发起一个Get请求,然后返回Body字符串。
var body = await client.GetStringAsync("/WeatherForecast");
5.2 发起Get请求到字节数组
//直接发起一个Get请求,然后返回Body数组。
var bodyBytes = await client.GetByteArrayAsync("/WeatherForecast");
5.3 发起Get请求到流数据
//直接发起一个Get请求文件,然后写入到流中。
using (var stream=File.Create("1.txt"))
{
await client.GetFileAsync("/WeatherForecast",stream);
}
5.4 构建自定义请求
//创建一个请求
var request = new HttpRequest();
request.InitHeaders()
.SetUrl("/WeatherForecast")
.SetHost(client.RemoteIPHost.Host)
.AsGet();
using (var responseResult = await client.RequestAsync(request, 1000 * 10))
{
var response = responseResult.Response;
Console.WriteLine(await response.GetBodyAsync());//将接收的数据,一次性转为utf8编码的字符串
}
5.5 构建自定义请求,持续读取大数据
//创建一个请求
var request = new HttpRequest();
request.InitHeaders()
.SetUrl("/WeatherForecast")
.SetHost(client.RemoteIPHost.Host)
.AsGet();
using (var responseResult = await client.RequestAsync(request, 1000 * 10))
{
var response = responseResult.Response;
while (true)
{
using (var blockResult = await response.ReadAsync())
{
//每次读到的数据
var memory = blockResult.Memory;
Console.WriteLine(memory.Length);
if (blockResult.IsCompleted)
{
//数据读完成
break;
}
}
}
}
5.6 构建自定义Post请求,持续写入流
using (var stream=File.OpenRead("TouchSocket.dll"))
{
//创建一个请求
var request = new HttpRequest();
request.SetContent(new StreamHttpContent(stream));//设置流内容
request.InitHeaders()
.SetUrl("/bigwrite")
.SetHost(client.RemoteIPHost.Host)
.AsPost();
using (var responseResult = await client.RequestAsync(request, 1000 * 10))
{
var response = responseResult.Response;
}
Console.WriteLine("完成");
}
提示
在构建自定义请求时,如果使用AsGet
、AsPost
等方法可以直接设置当前请求为Get
、Post
等。如果没有扩展方法可以使用时,可以使用AsMethod
来实现,例如:AsMethod("GET")
。