c# - C# HttpWebRequest vs HttpClient vs RestSharp
问题描述
我正在尝试以 3 种不同的方式发送一个简单的发布请求,前两个以 400 Bad Request 失败,只有 RestSharp 有效。我会说请求的正文和标头以相同的方式设置,所以我不明白出了什么问题。
使用HttpWebRequest
var httpRequest = (HttpWebRequest) WebRequest.Create(uri);
httpRequest.Method = "POST";
httpRequest.Accept = "application/json";
httpRequest.Headers["Authorization"] = $"Bearer {token}";
httpRequest.Headers["Client_Id"] = clientId;
httpRequest.ContentType = "application/json";
using (var streamWriter = new StreamWriter(httpRequest.GetRequestStream()))
{
streamWriter.Write(json);
}
var httpResponse = (HttpWebResponse) httpRequest.GetResponse();
使用HttpClient
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Add("Client_Id", clientId);
client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("deflate"));
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/json"));
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/x-json"));
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/javascript"));
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/xml"));
var content = new StringContent(json, Encoding.UTF8, "application/json");
var result = client.PostAsync(uri, content).Result;
}
Fiddler 中的原始文件
POST https://uri HTTP/1.1
Accept: application/json, text/json, text/x-json, text/javascript, application/xml, text/xml
Content-Type: application/json
Client_Id: 123456
Authorization: Bearer token
Accept-Encoding: gzip, deflate
Host: uri
Content-Length: 314
Expect: 100-continue
Connection: Keep-Alive
使用RestClient
var restClient = new RestClient(uri);
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddHeader("Client_Id", clientId);
request.AddHeader("Authorization", $"Bearer {token}");
request.AddParameter("application/json", json, ParameterType.RequestBody);
IRestResponse response = restClient.Execute(request);
Fiddler 中的原始文件
POST https://uri HTTP/1.1
Accept: application/json, text/json, text/x-json, text/javascript, application/xml, text/xml
Content-Type: application/json
Client_Id: 123456
Authorization: Bearer token
User-Agent: RestSharp/106.12.0.0
Host: uri
Content-Length: 314
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
解决方案
HttpClient 的一部分:StringContent 在 Content-Type 末尾添加字符集值,application/json; charset=utf-8
因此可能会导致 400 错误。
您可以使用此代码将其删除content .Headers.ContentType.CharSet = "";
推荐阅读
- android - Android工作室中的重定向
- windows - 在 Windows 上构建没有 Docker 的 Docker 映像
- mysql - SQL 字符串 - 确保每组有 2 个结果/以 fild 和 count/更快的方式拆分数字
- r - 基于其他列创建新的 data.table 列
- css - 如何创建响应式流体 CSS 网格
- node.js - greenlock-express:TypeError:greenlock.app 不是函数
- php - 如果使用 domdocument 之后存在术语,则获取标签的内容
- r - 调整文本框Grob
- c# - 比较从数据库中提取的数据值和转发器中的标签数据不起作用asp.net c#
- kubernetes - 无法访问 Kubernetes 集群的仪表板