Publique um corpo vazio na API REST via HttpClient

119

A API que estou tentando chamar requer que eu faça um POST, mas com o corpo vazio. Eu sou novo no uso do WCF Web API HttpClient e não consigo descobrir o código de gravação que faria uma postagem com um corpo vazio. Encontro referências a algum método HttpContent.CreateEmpty (), mas não acho que seja para o código HttpClient da API da Web, pois não consigo encontrar esse método.

Ryan Rinaldi
fonte
HttpContent.CreateEmpty era do antigo protótipo HttpClient que fazia parte do REST Starter kit. Infelizmente, não há equivalente no novo HttpClient.
Darrel Miller
1
@MichaelFreidgeim Se houve um buraco no continuum espaço-tempo e de alguma forma 2013 veio antes de 2011, então sim é uma possível duplicata.
Ryan Rinaldi
1
"Possível duplicação" é uma maneira de limpar - fechar perguntas semelhantes e manter uma com as melhores respostas. A data não é essencial. Consulte meta.stackexchange.com/questions/147643/… Se você concorda que isso requer esclarecimentos, vote em meta.stackexchange.com/questions/281980/…
Michael Freidgeim

Respostas:

119

Use StringContentou ObjectContentque derivam de HttpContentou você pode usar nullcomo HttpContent:

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

Alexander Zeitler
fonte
Parece que isso é apenas no .NET framework 4.5? msdn.microsoft.com/en-us/library/…
dan
Ele será fornecido com a API da Web do WCF, mas acho que algumas das "partes boas" farão parte da própria estrutura.
Alexander Zeitler
Por que não existe nenhum método de sobrecarga que não exija uma HttpContentclasse? Devemos pelo menos fornecer algo (mesmo uma string vazia) para fazer uma postagem http?
tugberk
75
Você pode usar nullcomo HttpContent, isso não enviará nenhum corpo na solicitação, por exemplovar response = await client.PostAsync(requestUri, null);
Owain Williams
105

Já fiz isso antes, basta mantê-lo simples:

Task<HttpResponseMessage> task = client.PostAsync(url, null);
Ogglas
fonte
7
Esta é uma resposta mais limpa do que a aceita e deve ser votada.
David Ebbo
4

Descobri que:

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

Adiciona nulo ao corpo da solicitação, que falhou no WSO2. Substituído por:

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

E funcionou.

Ryan Tuck
fonte
Não posso confirmar esse achado (mas não tenho certeza se meu teste foi totalmente adequado). Quando faço POST em uma de minhas próprias APIs com um nullconteúdo e vejo o conteúdo encontrado no HttpRequestMessage, pareço estar obtendo um comprimento de zero bytes.
OR Mapper
1

Para resolver esse problema, use este exemplo:

   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;
            }
Abolfazl Mousavi
fonte
-6

Acho que isso acontece automaticamente se o seu método da web não tiver parâmetros ou se todos eles se encaixarem no modelo de URL.

Por exemplo, esta declaração envia um corpo vazio:

  [OperationContract]
  [WebGet(UriTemplate = "mykewlservice/{emailAddress}",
     RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json,
     BodyStyle = WebMessageBodyStyle.Wrapped)]
  void GetStatus(string emailAddress, out long statusMask);
Ivan G.
fonte
Estou tentando ENVIAR um corpo vazio. O método HttpClient.Post () requer um URI e um objeto HttpContent. Não sou o que passar por HttpContent quando não quero enviar nada.
Ryan Rinaldi
Portanto, você não está usando o WCF. Isso é ainda mais fácil: ... HttpWebRequest request = (HttpWebRequest) WebRequest.Create ("http: // ..."); request.Method = "POST"; HttpWebResponse respose = (HttpWebResponse) request.GetResponse (); ... você resulta em resposta
Ivan G.
1
Estou usando HttpClient, não HttpWebRequest. Usar StringContent com uma string vazia funcionou.
Ryan Rinaldi