Мне нужно опубликовать объект в таком формате:
POST https://link
{
"country": "nld",
"emailaddress": "[email protected]",
"phone": "123",
"notify_url": "https://asd.com"
}
Я пытался:
var url = "URL";
var httpRequest = (HttpWebRequest)WebRequest.Create(url);
httpRequest.Accept = "*/*";
httpRequest.Headers["Authorization"] = "Bearer " + apiKey;
var postData = "country" + Uri.EscapeDataString("hello");
postData += "emailaddress" + Uri.EscapeDataString("world");
postData += "phone" + Uri.EscapeDataString("123");
postData += "notify_url" + Uri.EscapeDataString("d3wq");
var data = Encoding.ASCII.GetBytes(postData);
httpRequest.Method = "POST";
httpRequest.ContentType = "application/x-www-form-urlencoded";
httpRequest.ContentLength = data.Length;
using (var stream = httpRequest.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
HttpWebResponse httpResponse = null;
try
{
httpResponse = (HttpWebResponse)httpRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
var result = streamReader.ReadToEnd();
}
}
catch (Exception e) { }
Но сервер возвращает 400 неверных запросов. Я думаю, что данные в недопустимом формате.
Как я могу изменить свой код, чтобы привести данные в правильный формат?
Спасибо!
Обычно в заголовках авторизации вместо ключа API предоставляется токен доступа носителя.
Отвечает ли это на ваш вопрос? Как отправить JSON на сервер с помощью C#?
Почему вы используете POST? POST - это когда запрос имеет тело. В вашем запросе всего четыре заголовка. Длина содержимого будет равна нулю. 400 может быть связано с тем, что сервер ожидает тело, а у вас нет тела.
@Self, черт возьми, на этом сайте много голосов за плохой код. Посмотрите на принятый ответ на второй вопрос и ответ, на который вы ссылаетесь. «await Task.Run(() => JsonConvert.SerializeObject(payload))»? Действительно? StringContent, ReadAsStringAsync()? Метод расширения PostAsJsonAsync() существует уже более шести лет.
@CodeCaster, Хороший улов. Я просто не читаю большую часть кода. Большую часть времени я могу найти цель для дурака, не читая вопрос. Я постараюсь дать код ответов получше, если их числа не слишком велики. Но простой поисковый запрос возвращает слишком много возможных ошибок.





Пример запроса, который вы показываете, показывает тело запроса JSON, но вы сообщаете серверу в своем HttpWebRequest, что входящий тип контента будет публикацией формы. Но тогда вы не отправляете сообщение формы, вы публикуете одну длинную строку:
countryhelloemailaddressworldphone123 // and so on
Не используйте HttpWebRequest в 2021 году. Это API, которому уже два десятилетия, и на сегодняшний день у него есть более удобные для разработчиков альтернативы.
Вместо этого используйте HttpClient, у которого есть удобные (расширенные) методы для отправки и получения JSON:
var postModel = new
{
country = "...",
emailaddress = "...",
...
};
var client = new HttpClient();
var response = await client.PostAsJsonAsync(postModel);
Для этого метода расширения вам потребуется установить пакет Microsoft.AspNet.WebApi.Client NuGet.
Если вы настаиваете на использовании HttpWebRequest, в чем я очень сомневаюсь, ответ на ваш вопрос будет в Как отправить JSON на сервер с помощью C#?, поскольку этот вопрос и ответ показывают, как использовать этот древний API.
Спасибо. По ряду причин я должен использовать веб-запрос. Можете ли вы показать мне, как это делается с помощью этого старого API? :)
это httpclient из system..net.http? потому что у меня нет postasjsonasync для меня ...
См. stackoverflow.com/questions/19158378/…. Это метод расширения в пакете Microsoft.AspNet.WebApi.Client NuGet.
И снова здравствуйте; Я попробовал еще раз, но всегда получаю неверный запрос: HttpClient client = new HttpClient (); var url = "url"; client.DefaultRequestHeaders.Add («Авторизация», «Носитель» + apiKey); var postModel = new {country = "asd", emailaddress = "[email protected]", phone = "123456", notify_url = "www.hello.com",}; var response = await client.PostAsJsonAsync (url, postModel);
Затем вам нужно проконсультироваться с документацией по указанному API, чтобы узнать, почему он не принимает эти полезные данные.
Я видел, что сервер получает пустой запрос. Как оно может быть пустым?
Я не знаю. Проверьте запрос с помощью Fiddler, и, если он содержит полезную нагрузку, выполните отладку сервера.
Спасибо. Работа с почтальоном устранила проблему. По-видимому, API проверил входные значения, если они действительны, например: действительный ли это адрес электронной почты, действительный ли это номер телефона и т. д. Это была последняя проблема, с которой я столкнулся. Спасибо за помощь!
Создайте объект, который нужно отправить в свой веб-запрос.
var xObject = new { xData = ... };
и после этого использовать;
var newJsonData = JsonSerializer.Serialize(xObject);
newJsonData - это строка в формате JSON, которую вы можете отправить в свой веб-запрос.
попробуй поменять на
httpRequest.ContentType= "application/json";stackoverflow.com/questions/9145667/…