Eu tenho um tipo complexo personalizado com o qual desejo trabalhar usando a API da Web.
public class Widget
{
public int ID { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
E aqui está meu método de controlador de API da web. Eu quero postar este objeto assim:
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;
}
}
E agora eu gostaria de usar System.Net.HttpClient
para fazer a chamada ao método. No entanto, não tenho certeza de que tipo de objeto passar para o PostAsync
método e como construí-lo. Aqui está um exemplo de código do cliente.
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();
});
Como faço para criar o HttpContent
objeto de uma maneira que a API da web o entenda?
c#
asp.net-web-api
indot_brad
fonte
fonte
Respostas:
O genérico
HttpRequestMessage<T>
foi removido . Este :vai não funcionam mais .
Em vez disso, a partir desta postagem , a equipe ASP.NET incluiu algumas novas chamadas para oferecer suporte a essa funcionalidade:
Então, o novo código ( de Dunston ) se torna:
fonte
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 KeyValuePair`?PostUrlEncodedAsync
.PostAsJsonAsync
ouPostAsXmlAsync
Você deve usar o
SendAsync
método em vez disso, este é um método genérico, que serializa a entrada para o serviçoSe você não quiser criar a classe concreta, você pode fazer isso com a
FormUrlEncodedContent
classeObservação: você precisa tornar seu id um int (
int?
) anulávelfonte
Observe que, se você estiver usando uma Biblioteca de Classes Portátil, HttpClient não terá o método PostAsJsonAsync . Para postar um conteúdo como JSON usando uma Biblioteca de Classes Portátil, você terá que fazer o seguinte:
fonte
Se você quiser os tipos de métodos de conveniência mencionados em outras respostas, mas precisam de portabilidade (ou mesmo se não), você pode querer verificar Flurl [divulgação: eu sou o autor]. Ele envolve o
HttpClient
Json.NET e adiciona um pouco de açúcar fluente e outras guloseimas, incluindo alguns auxiliares de teste integrados .Postar como JSON:
ou codificado por URL:
Ambos os exemplos acima retornam um
HttpResponseMessage
, mas Flurl inclui métodos de extensão para retornar outras coisas se você quiser ir direto ao ponto:Flurl está disponível no NuGet:
fonte
Depois de investigar várias alternativas, descobri outra abordagem, adequada para a versão API 2.0.
(VB.NET é o meu favorito, então ...)
Boa sorte! Para mim deu certo (no final!).
Atenciosamente, Peter
fonte
Eu acho que você pode fazer isso:
fonte
No caso de alguém como eu não ter entendido muito bem o que todos acima estão falando, dou um exemplo fácil que está funcionando para mim. Se você tem uma api web cujo url é " http://somesite.com/verifyAddress ", é um método de postagem e você precisa passar um objeto de endereço. Você deseja chamar esta API em seu código. Aqui está o que você pode fazer.
fonte
Este é o código que acabei usando, com base nas outras respostas aqui. Isso é para um HttpPost que recebe e responde com tipos complexos:
fonte
Faça uma chamada de serviço como esta:
E método de serviço como este:
PutAsJsonAsync cuida da serialização e desserialização na rede
fonte
PostAsJsonAsync
irá enviar os dados requeridos, como um POST em JSON.