C# post json-объект с использованием httpWebRequst

Мне нужно опубликовать объект в таком формате:

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 неверных запросов. Я думаю, что данные в недопустимом формате.

Как я могу изменить свой код, чтобы привести данные в правильный формат?

Спасибо!

попробуй поменять на httpRequest.ContentType= "application/json";stackoverflow.com/questions/9145667/…

Александр Инженер 30.03.2021 13:38

Обычно в заголовках авторизации вместо ключа API предоставляется токен доступа носителя.

Jamshaid K. 30.03.2021 13:38

Отвечает ли это на ваш вопрос? Как отправить JSON на сервер с помощью C#?

Self 30.03.2021 13:39
stackoverflow.com/questions/23585919/…
Self 30.03.2021 13:40

Почему вы используете POST? POST - это когда запрос имеет тело. В вашем запросе всего четыре заголовка. Длина содержимого будет равна нулю. 400 может быть связано с тем, что сервер ожидает тело, а у вас нет тела.

jdweng 30.03.2021 13:41

@Self, черт возьми, на этом сайте много голосов за плохой код. Посмотрите на принятый ответ на второй вопрос и ответ, на который вы ссылаетесь. «await Task.Run(() => JsonConvert.SerializeObject(payload))»? Действительно? StringContent, ReadAsStringAsync()? Метод расширения PostAsJsonAsync() существует уже более шести лет.

CodeCaster 30.03.2021 13:42

@CodeCaster, Хороший улов. Я просто не читаю большую часть кода. Большую часть времени я могу найти цель для дурака, не читая вопрос. Я постараюсь дать код ответов получше, если их числа не слишком велики. Но простой поисковый запрос возвращает слишком много возможных ошибок.

Self 30.03.2021 15:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Пример запроса, который вы показываете, показывает тело запроса 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? :)

Jay 30.03.2021 13:42

это httpclient из system..net.http? потому что у меня нет postasjsonasync для меня ...

Jay 30.03.2021 13:48

См. stackoverflow.com/questions/19158378/…. Это метод расширения в пакете Microsoft.AspNet.WebApi.Client NuGet.

CodeCaster 30.03.2021 13:49

И снова здравствуйте; Я попробовал еще раз, но всегда получаю неверный запрос: 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);

Jay 30.03.2021 13:59

Затем вам нужно проконсультироваться с документацией по указанному API, чтобы узнать, почему он не принимает эти полезные данные.

CodeCaster 30.03.2021 14:02

Я видел, что сервер получает пустой запрос. Как оно может быть пустым?

Jay 30.03.2021 14:26

Я не знаю. Проверьте запрос с помощью Fiddler, и, если он содержит полезную нагрузку, выполните отладку сервера.

CodeCaster 30.03.2021 14:27

Спасибо. Работа с почтальоном устранила проблему. По-видимому, API проверил входные значения, если они действительны, например: действительный ли это адрес электронной почты, действительный ли это номер телефона и т. д. Это была последняя проблема, с которой я столкнулся. Спасибо за помощь!

Jay 30.03.2021 15:01

Создайте объект, который нужно отправить в свой веб-запрос.

var xObject = new { xData = ... };

и после этого использовать;

var newJsonData = JsonSerializer.Serialize(xObject);

newJsonData - это строка в формате JSON, которую вы можете отправить в свой веб-запрос.

Другие вопросы по теме