Tengo un tipo complejo personalizado con el que quiero trabajar usando Web API.
public class Widget
{
public int ID { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
Y aquí está mi método de controlador de API web. Quiero publicar este objeto así:
public class TestController : ApiController
{
// POST /api/test
public HttpResponseMessage<Widget> Post(Widget widget)
{
widget.ID = 1; // hardcoded for now. TODO: Save to db and return newly created ID
var response = new HttpResponseMessage<Widget>(widget, HttpStatusCode.Created);
response.Headers.Location = new Uri(Request.RequestUri, "/api/test/" + widget.ID.ToString());
return response;
}
}
Y ahora me gustaría usar System.Net.HttpClient
para hacer la llamada al método. Sin embargo, no estoy seguro de qué tipo de objeto pasar al PostAsync
método y cómo construirlo. Aquí hay un código de cliente de muestra.
var client = new HttpClient();
HttpContent content = new StringContent("???"); // how do I construct the Widget to post?
client.PostAsync("http://localhost:44268/api/test", content).ContinueWith(
(postTask) =>
{
postTask.Result.EnsureSuccessStatusCode();
});
¿Cómo creo el HttpContent
objeto de manera que la API web lo entienda?
c#
asp.net-web-api
indot_brad
fuente
fuente
Respuestas:
Se
HttpRequestMessage<T>
ha eliminado el genérico . Esta :se ya no funcionan .
En cambio, a partir de esta publicación , el equipo de ASP.NET ha incluido algunas llamadas nuevas para admitir esta funcionalidad:
Entonces, el nuevo código ( de Dunston ) se convierte en:
fuente
HttpClient.PostAsXXXAsync<T>( T value ) methods are great, but what about one for application/x-www-form-urlencoded format? Is there a simple / short way for that or do we still need to create elaborate
listas de KeyValuePair`?PostUrlEncodedAsync
.PostAsJsonAsync
oPostAsXmlAsync
Debería usar el
SendAsync
método en su lugar, este es un método genérico, que serializa la entrada al servicioSi no desea crear la clase concreta, puede hacerlo con la
FormUrlEncodedContent
claseNota: debe convertir su identificación en un int (
int?
) que acepta valores NULLfuente
Tenga en cuenta que si está utilizando una biblioteca de clases portátil, HttpClient no tendrá el método PostAsJsonAsync . Para publicar un contenido como JSON usando una biblioteca de clases portátil, tendrá que hacer esto:
fuente
Si desea los tipos de métodos de conveniencia mencionados en otras respuestas pero necesita portabilidad (o incluso si no la necesita), es posible que desee consultar Flurl [divulgación: soy el autor]. Envuelve (finamente)
HttpClient
y Json.NET y agrega algo de azúcar fluido y otras ventajas, incluidos algunos ayudantes de prueba incorporados .Publicar como JSON:
o codificado en URL:
Ambos ejemplos anteriores devuelven un
HttpResponseMessage
, pero Flurl incluye métodos de extensión para devolver otras cosas si solo desea ir al grano:Flurl está disponible en NuGet:
fuente
Después de investigar muchas alternativas, me encontré con otro enfoque, adecuado para la versión API 2.0.
(VB.NET es mi favorito, muuuy ...)
¡Buena suerte! Para mí esto funcionó (¡al final!).
Saludos, Peter
fuente
Creo que puedes hacer esto:
fuente
En caso de que alguien como yo no entienda realmente de qué están hablando todos los anteriores, doy un ejemplo sencillo que me está funcionando. Si tiene una API web cuya URL es " http://somesite.com/verifyAddress ", es un método de publicación y necesita que le pase un objeto de dirección. Quieres llamar a esta api en tu código. Aquí lo que puedes hacer.
fuente
Este es el código con el que terminé, basado en las otras respuestas aquí. Esto es para un HttpPost que recibe y responde con tipos complejos:
fuente
Realice una llamada de servicio como esta:
Y método de servicio como este:
PutAsJsonAsync se encarga de la serialización y deserialización en la red
fuente
PostAsJsonAsync
, enviará los datos requeridos, como un POST en JSON.