Отправьте пустое тело в REST API через HttpClient


119

API, который я пытаюсь вызвать, требует, чтобы я выполнял POST, но с пустым телом. Я новичок в использовании WCF Web API HttpClient, и я не могу найти код записи, который делал бы сообщение с пустым телом. Я нахожу ссылки на какой-то метод HttpContent.CreateEmpty (), но я не думаю, что это касается кода HttpClient веб-API, так как я не могу найти этот метод.


HttpContent.CreateEmpty был взят из старого прототипа HttpClient, который был частью начального набора REST. К сожалению, в новом HttpClient нет эквивалента.
Даррел Миллер,


1
@MichaelFreidgeim Если бы в пространственно-временном континууме была дыра, и каким-то образом 2013 год наступил раньше 2011 года, то да, это возможный дубликат.
Райан Ринальди

1
«Возможный дубликат» - это способ навести порядок - закрыть похожие вопросы и оставить один с лучшими ответами. Дата не важна. См. Meta.stackexchange.com/questions/147643/… Если вы согласны с тем, что это требует разъяснения, пожалуйста, проголосуйте на meta.stackexchange.com/questions/281980/…
Майкл Фрейдгейм

Ответы:


119

Используйте StringContentили ObjectContentкоторые являются производными HttpContentили вы можете использовать nullкак HttpContent:

var response = await client.PostAsync(requestUri, null);


Похоже, это только в .NET framework 4.5? msdn.microsoft.com/en-us/library/…
дан

Он будет поставляться с веб-API WCF, но я думаю, что некоторые из «хороших частей» войдут в сам фреймворк.
Александр Цайтлер

Почему нет методов перегрузки, для которых не нужен HttpContentкласс? Должны ли мы хотя бы предоставить что-то (даже пустую строку) для публикации http-сообщения?
tugberk

75
Вы можете использовать nullв качестве HttpContent, это не будет отправлять тело в запросе, напримерvar response = await client.PostAsync(requestUri, null);
Оуэн Уильямс,

105

Делал это раньше, просто пусть будет проще:

Task<HttpResponseMessage> task = client.PostAsync(url, null);

7
Это чище, чем принятый ответ, и за него следует проголосовать.
Дэвид Эббо

4

Нашли, что:

Task<HttpResponseMessage> task = client.PostAsync(url, null);

Добавляет null в тело запроса, который не удался на WSO2. Заменено на:

Task<HttpResponseMessage> task = client.PostAsync(url, new {});

И сработало.


Я не могу подтвердить этот вывод (но не уверен, что мой тест был полностью адекватным). Когда я отправляю POST в один из моих собственных API-интерфейсов с nullконтентом и смотрю на контент, найденный в HttpRequestMessage, мне кажется, что длина составляет ноль байтов.
OR Mapper

1

Чтобы решить эту проблему, используйте этот пример:

   using (var client = new HttpClient())
            {
                var stringContent = new StringContent(string.Empty);
                stringContent.Headers.ContentType = MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded");
                var response = client.PostAsync(url, stringContent).Result;
                var result = response.Content.ReadAsAsync<model>().Result;
            }

-6

Я думаю, что это происходит автоматически, если ваш веб-метод не имеет параметров или все они вписываются в шаблон URL.

Например, это объявление отправляет пустое тело:

  [OperationContract]
  [WebGet(UriTemplate = "mykewlservice/{emailAddress}",
     RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json,
     BodyStyle = WebMessageBodyStyle.Wrapped)]
  void GetStatus(string emailAddress, out long statusMask);

Пытаюсь ОТПРАВИТЬ пустое тело. Для метода HttpClient.Post () требуется URI и объект HttpContent. Меня не следует передавать как HttpContent, если я не хочу ничего отправлять.
Райан Ринальди

Итак, вы не используете WCF. Это еще проще: ... HttpWebRequest request = (HttpWebRequest) WebRequest.Create ("http: // ..."); request.Method = "POST"; HttpWebResponse respose = (HttpWebResponse) request.GetResponse (); ... вы результат в ответ
Иван Григорьевич

1
Я использую HttpClient, а не HttpWebRequest. Использование StringContent с пустой строкой сработало.
Райан Ринальди
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.