Publique un cuerpo vacío en la API REST a través de HttpClient


119

La API que estoy tratando de llamar requiere que haga un POST pero con un cuerpo vacío. Soy nuevo en el uso de WCF Web API HttpClient y parece que no puedo encontrar el código de escritura que haría una publicación con un cuerpo vacío. Encuentro referencias a algún método HttpContent.CreateEmpty (), pero no creo que sea para el código Web API HttpClient ya que parece que no puedo encontrar ese método.


HttpContent.CreateEmpty era del antiguo prototipo de HttpClient que formaba parte del kit de inicio REST. Desafortunadamente, no hay equivalente en el nuevo HttpClient.
Darrel Miller


1
@MichaelFreidgeim Si hubo un agujero en el continuo espacio-tiempo y de alguna manera 2013 llegó antes de 2011, entonces sí, es un posible duplicado.
Ryan Rinaldi

1
"Posible duplicado" es una forma de limpiar: cerrar preguntas similares y mantener una con las mejores respuestas. La fecha no es imprescindible. Consulte meta.stackexchange.com/questions/147643/… Si acepta que requiere una aclaración, vote en meta.stackexchange.com/questions/281980/…
Michael Freidgeim

Respuestas:


118

Use StringContento ObjectContentque se derive de HttpContento puede usar nullcomo HttpContent:

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


¿Parece que esto es solo en .NET framework 4.5? msdn.microsoft.com/en-us/library/…
dan

Se enviará con WCF Web API pero creo que algunas de las "partes buenas" se incluirán en el marco en sí.
Alexander Zeitler

¿Por qué no hay métodos de sobrecarga que no requieran una HttpContentclase? ¿Deberíamos al menos proporcionar algo (incluso una cadena vacía) para hacer una publicación http?
tugberk

75
Puede usarlo nullcomo HttpContent, esto no enviará ningún cuerpo en la solicitud, por ejemplovar response = await client.PostAsync(requestUri, null);
Owain Williams

105

Hice esto antes, simplemente manténgalo simple:

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

7
Esta es una respuesta más limpia que la aceptada y debe votarse a favor.
David Ebbo

4

Han descubierto que:

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

Agrega un valor nulo al cuerpo de la solicitud, que falló en WSO2. Reemplazadas con:

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

Y funcionó.


No puedo confirmar este hallazgo (pero no estoy seguro de que mi prueba fuera totalmente adecuada). Cuando publico en una de mis propias API con un nullcontenido y miro el contenido que se encuentra en HttpRequestMessage, parece que obtengo una longitud de cero bytes.
OR Mapper

1

Para resolver este problema, use este ejemplo:

   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

Creo que lo hace automáticamente si su método web no tiene parámetros o si todos encajan en la plantilla de URL.

Por ejemplo, esta declaración envía un cuerpo vacío:

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

Estoy intentando ENVIAR un cuerpo vacío. El método HttpClient.Post () requiere un URI y un objeto HttpContent. No soy qué pasar como HttpContent cuando no quiero enviar nada.
Ryan Rinaldi

Entonces no estás usando WCF. Eso es aún más fácil: ... HttpWebRequest request = (HttpWebRequest) WebRequest.Create ("http: // ..."); request.Method = "POST"; HttpWebResponse respose = (HttpWebResponse) request.GetResponse (); ... resulta en respuesta
Ivan G.

1
Estoy usando HttpClient, no HttpWebRequest. Usar StringContent con una cadena vacía funcionó.
Ryan Rinaldi
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.