Estou usando System.Net.Http
, encontrei vários exemplos na web. Consegui criar este código para fazer um POST
pedido:
public static string POST(string resource, string token)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(baseUri);
client.DefaultRequestHeaders.Add("token", token);
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("", "")
});
var result = client.PostAsync("", content).Result;
string resultContent = result.Content.ReadAsStringAsync().Result;
return resultContent;
}
}
tudo funcionando bem. Mas suponha que eu queira passar um terceiro parâmetro para o POST
método, um parâmetro chamado data
. O parâmetro de dados é um objeto como este:
object data = new
{
name = "Foo",
category = "article"
};
como posso fazer isso sem criar o KeyValuePair
? Meu php RestAPI
espera uma entrada json, então FormUrlEncodedContent
deve enviar o raw
json corretamente. Mas como posso fazer isso Microsoft.Net.Http
? Obrigado.
c#
json
dotnet-httpclient
IlDrugo
fonte
fonte
using
para oHttpClient
. aspnetmonsters.com/2016/08/2016-08-27-httpclientwrongusing
que não deve ser usado:HttpClient is intended to be instantiated once and reused throughout the life of an application. The following conditions can result in SocketException errors: Creating a new HttpClient instance per request. Server under heavy load. Creating a new HttpClient instance per request can exhaust the available sockets.
docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/…Respostas:
A resposta direta à sua pergunta é: Não. A assinatura do
PostAsync
método é a seguinte:Portanto, embora você possa passar um
object
para,PostAsync
ele deve ser do tipoHttpContent
e seu tipo anônimo não atende a esses critérios.No entanto, existem maneiras de realizar o que você deseja realizar. Primeiro, você precisará serializar seu tipo anônimo para JSON, a ferramenta mais comum para isso é Json.NET . E o código para isso é bastante trivial:
var myContent = JsonConvert.SerializeObject(data);
Em seguida, você precisará construir um objeto de conteúdo para enviar esses dados. Vou usar um
ByteArrayContent
objeto, mas você pode usar ou criar um tipo diferente, se quiser.var buffer = System.Text.Encoding.UTF8.GetBytes(myContent); var byteContent = new ByteArrayContent(buffer);
Em seguida, você deseja definir o tipo de conteúdo para permitir que a API saiba que é JSON.
byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
Em seguida, você pode enviar sua solicitação muito semelhante ao exemplo anterior com o conteúdo do formulário:
var result = client.PostAsync("", byteContent).Result
Por outro lado, chamar a
.Result
propriedade como você está fazendo aqui pode ter alguns efeitos colaterais ruins , como bloqueio morto, então você deve ter cuidado com isso.fonte
POST, PUT, DELETE
é executado, geralmente o retorno da APITRUE
, declaro o método comostring
, mas quando faço:return result;
Eu obtenhoCan't Convert HttpResponseMessage in string
:, devo alterar a declaração do método? Eu preciso da resposta da string porque vou precisar desserializar depois em outro método de classe.result.Content.ReadAsStringAsync()
provavelmente será adequado retornar a string da maneira que você fez em sua pergunta (usando ). Dependendo da estrutura do seu aplicativo, pode ser melhor retornar oContent
objeto diretamente se você precisar inspecionar os cabeçalhos para determinar qual é o tipo de conteúdo (por exemplo, XML ou JSON). Mas se você sabe que ele sempre retornará JSON (ou algum outro formato), basta retornar o corpo da resposta como uma string.StringContent
?StringContent
diretamente para,PostAsync
uma vez que deriva deHttpContent
.Você precisa passar seus dados no corpo da solicitação como uma string bruta em vez de
FormUrlEncodedContent
. Uma maneira de fazer isso é serializá-lo em uma string JSON:var json = JsonConvert.SerializeObject(data); // or JsonSerializer.Serialize if using System.Text.Json
Agora tudo que você precisa fazer é passar a string para o método post.
var stringContent = new StringContent(json, UnicodeEncoding.UTF8, "application/json"); // use MediaTypeNames.Application.Json in Core 3.0+ and Standard 2.1+ var client = new HttpClient(); var response = await client.PostAsync(uri, stringContent);
fonte
stringContent
? No meu caso, ostringContent
valor é"\"\""
. Este é o valor correto?Uma solução simples é usar
Microsoft ASP.NET Web API 2.2 Client
a partir NuGet .Em seguida, você pode simplesmente fazer isso e serializar o objeto para JSON e definir o
Content-Type
cabeçalho paraapplication/json; charset=utf-8
:var data = new { name = "Foo", category = "article" }; var client = new HttpClient(); client.BaseAddress = new Uri(baseUri); client.DefaultRequestHeaders.Add("token", token); var response = await client.PostAsJsonAsync("", data);
fonte
Agora existe uma maneira mais simples com
.NET Standard
ou.NET Core
:var client = new HttpClient(); var response = await client.PostAsync(uri, myRequestObject, new JsonMediaTypeFormatter());
NOTA: Para usar a
JsonMediaTypeFormatter
classe, você precisará instalar oMicrosoft.AspNet.WebApi.Client
pacote NuGet, que pode ser instalado diretamente ou por meio de outro, comoMicrosoft.AspNetCore.App
.Usando essa assinatura de
HttpClient.PostAsync
, você pode passar qualquer objeto e oJsonMediaTypeFormatter
fará automaticamente a serialização etc.Com a resposta, você pode usar
HttpContent.ReadAsAsync<T>
para desserializar o conteúdo da resposta para o tipo que você está esperando:var responseObject = await response.Content.ReadAsAsync<MyResponseType>();
fonte
.NET Standard
ou.NET Core
, como mencionei. Talvez você esteja usando.NET Framework
? Em meu projeto, o JsonMediaTypeFormatter está sendo carregado a partir daqui: C: \ Arquivos de programas \ dotnet \ sdk \ NuGetFallbackFolder \ microsoft.aspnet.webapi.client \ 5.2.6 \ lib \ netstandard2.0 \ System.Net.Http.Formatting. dll