簡體   English   中英

C# HttpWebRequest vs HttpClient vs RestSharp

[英]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 application/json; charset=utf-8所以它可能會導致 400 錯誤。

您可以使用此代碼content .Headers.ContentType.CharSet = "";

這是一篇很棒的文章,您可以查看有關 HttpClient 和 RestSharp 之間的比較 - HttpClientVsRestSharp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM