#c# #httpwebrequest #dotnet-httpclient #restsharp
Вопрос:
Я пытаюсь отправить простой запрос на отправку 3 различными способами, первые два не работают с 400 ошибочными запросами, работает только 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).Resu<
}
сырой в скрипаче
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);
сырой в скрипаче
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
Комментарии:
1. Пользователь-скрипач, чтобы определить разницу между вашими запросами и любыми будущими проблемами, хотя, за исключением отсутствующего типа контента, все они выглядят довольно похоже
2. Я обновил сообщение необработанными данными от Fiddler для httpclient и restsharp
3. Почему у вас есть
Expect: 100-continue
заголовки для стандартных клиентов? Обычно они не устанавливают этот заголовок автоматически. Сервер не смог понять этот заголовок и вызвать ошибку.
Ответ №1:
Часть HttpClient: StringContent добавляет значения кодировки в конце типа содержимого, например application/json; charset=utf-8
, чтобы это могло привести к ошибке 400.
Вы можете удалить его с помощью этого кода content .Headers.ContentType.CharSet = "";
Комментарии:
1. Попробовал, не получилось, я обновил сообщение необработанными данными, которые я получил от Скрипача по обоим запросам