详解C#中HttpClient的用法及相关问题的解决方法
什么是HttpClient?
HttpClient是一种可以使C#开发人员轻松使用HTTP协议进行Web服务交互的类。它是.NET框架的一部分,在System.Net.Http命名空间中,可以用于发送HTTP请求到一个URI并获取响应内容。
HttpClient的用法
创建HttpClient对象
要使用HttpClient类,需要先创建HttpClient对象。接下来是一个创建HttpClient对象的示例:
HttpClient httpClient = new HttpClient();
发送HTTP请求
使用HttpClient对象发送HTTP请求需要使用以下两个类:
- HttpRequestMessage:封装HTTP请求的信息。
- HttpResponseMessage:封装HTTP响应的信息。
以下是一个使用HttpClient发送HTTP GET请求的示例:
string uri = "https://api.github.com/users/octocat/gists";
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299");
HttpResponseMessage response = await httpClient.GetAsync(uri);
处理HTTP响应
在HttpClient中,要获得HTTP响应的内容,可以使用HttpResponseMessage对象。以下是一个处理HTTP响应的示例:
if (response.IsSuccessStatusCode)
{
string responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
HttpClient对象的配置
HttpClient对象具有一些配置属性可以用来优化性能和设置不同的操作,默认情况下,HttpClient对象的超时设置为100秒。下面是示例代码:
HttpClient httpClient = new HttpClient()
{
Timeout = TimeSpan.FromSeconds(30),
DefaultRequestHeaders =
{
AcceptEncoding =
{
new StringWithQualityHeaderValue("gzip"),
new StringWithQualityHeaderValue("deflate")
},
UserAgent =
{
new ProductInfoHeaderValue("Mozilla", "5.0"),
new ProductInfoHeaderValue(".NET", "Core"),
new ProductInfoHeaderValue("(Windows NT 10.0; Win64; x64)"),
new ProductInfoHeaderValue("AppleWebKit/537.36"),
new ProductInfoHeaderValue("(KHTML, like Gecko)"),
new ProductInfoHeaderValue("Chrome/54.0.2840.99"),
new ProductInfoHeaderValue("Safari/537.36")
}
}
};
异步操作
许多HttpClient方法都有一个对应的异步版本,它们会返回一个Task对象,这些方法类似于同步方法,但由于它们是异步的,所以不会阻塞线程。下面是异步操作的示例:
HttpResponseMessage response = await httpClient.GetAsync(uri);
HttpClient的常见问题
如何处理代理?
我们可以使用WebProxy类处理代理。下面的示例向HttpClient添加代理:
HttpClientHandler handler = new HttpClientHandler()
{
Proxy = new WebProxy("http://proxyserver:8080")
};
HttpClient httpClient = new HttpClient(handler);
HTTPS证书错误
在使用HttpClient处理HTTPS请求时,可能会遇到以下错误之一:
- 警告:StatusCode 226。服务器向前进行了操作,但返回了HTTP 1.1 226 IM Used响应。这意味着响应的第一个部分进行了正常处理,然后服务器继续处理它。
- System.Net.Http.HttpRequestException:“在请求完成前无法完成操作(由于在安全通道上进行了未处理的堆栈)”。
这些错误通常是因为HTTPS证书验证失败导致的。可以通过添加以下代码解决:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
示例:
示例一:使用HttpClient类获取Json数据
以下示例演示如何使用HttpClient类获取来自Web API的JSON数据
using System;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace ConsoleApp1
{
class Program
{
static async Task Main(string[] args)
{
HttpClient httpClient = new HttpClient();
string uri = "http://jsonplaceholder.typicode.com/posts";
HttpResponseMessage response = await httpClient.GetAsync(uri);
if (response.IsSuccessStatusCode)
{
string responseBody = await response.Content.ReadAsStringAsync();
dynamic jsonData = JsonConvert.DeserializeObject(responseBody);
foreach (var item in jsonData)
{
Console.WriteLine($"{item.id} - {item.title}");
}
}
Console.ReadLine();
}
}
}
示例二:使用HttpClient类下载文件
以下示例演示如何使用HttpClient类下载文件
using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static async Task Main(string[] args)
{
string uri = "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf";
HttpClient httpClient = new HttpClient();
HttpResponseMessage response = await httpClient.GetAsync(uri, HttpCompletionOption.ResponseHeadersRead);
string target = "dummy.pdf";
using (Stream streamToReadFrom = await response.Content.ReadAsStreamAsync())
{
using (Stream streamToWriteTo = File.Open(target, FileMode.Create))
{
await streamToReadFrom.CopyToAsync(streamToWriteTo);
}
}
Console.WriteLine("File downloaded");
Console.ReadLine();
}
}
}
以上是对C#中HttpClient的用法及相关问题的解决方法的详细讲解。希望这能帮助您更好地使用HttpClient来与Web服务进行交互。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C#中HttpClient的用法及相关问题的解决方法 - Python技术站