Опублікуйте порожнє тіло в API REST через HttpClient


119

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


HttpContent.CreateEmpty був зі старого прототипу HttpClient, який був частиною набору REST Starter. На жаль, в новому 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-пост?
тугберк

75
Ви можете використовувати його nullяк HttpContent, це не надсилатиме жодного органу у запиті, наприкладvar response = await client.PostAsync(requestUri, null);
Owain Williams,

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 {});

І працювали.


Я не можу підтвердити цей висновок (але я не впевнений, що мій тест був цілком адекватним). Коли я розміщую один із власних API з nullвмістом і переглядаю вміст, знайдений у HttpRequestMessage, я, здається, отримую довжину нульових байтів.
АБО 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 запит = (HttpWebRequest) WebRequest.Create ("http: // ..."); request.Method = "POST"; HttpWebResponse respose = (HttpWebResponse) запит.GetResponse (); ... ви отримуєте відповідь
Іван Григорович

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