J'utilise System.Net.Http
, j'ai trouvé plusieurs exemples sur le web. J'ai réussi à créer ce code pour faire une POST
demande:
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;
}
}
tout fonctionne bien. Mais supposons que je veuille passer un troisième paramètre à la POST
méthode, un paramètre appelé data
. Le paramètre de données est un objet comme celui-ci:
object data = new
{
name = "Foo",
category = "article"
};
comment puis-je faire cela sans créer le KeyValuePair
? Mon php RestAPI
attend une entrée json, donc le FormUrlEncodedContent
devrait envoyer raw
correctement le json. Mais comment puis-je faire cela Microsoft.Net.Http
? Merci.
c#
json
dotnet-httpclient
IlDrugo
la source
la source
using
pour leHttpClient
. aspnetmonsters.com/2016/08/2016-08-27-httpclientwrongusing
ne devrait pas être utilisé: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/…Réponses:
La réponse directe à votre question est: Non. La signature de la
PostAsync
méthode est la suivante:Ainsi, bien que vous puissiez passer un
object
à,PostAsync
il doit être de typeHttpContent
et votre type anonyme ne répond pas à ces critères.Cependant, il existe des moyens d'accomplir ce que vous voulez accomplir. Tout d'abord, vous devrez sérialiser votre type anonyme en JSON, l'outil le plus courant pour cela est Json.NET . Et le code pour cela est assez trivial:
var myContent = JsonConvert.SerializeObject(data);
Ensuite, vous devrez construire un objet de contenu pour envoyer ces données, j'utiliserai un
ByteArrayContent
objet, mais vous pouvez utiliser ou créer un type différent si vous le souhaitez.var buffer = System.Text.Encoding.UTF8.GetBytes(myContent); var byteContent = new ByteArrayContent(buffer);
Ensuite, vous souhaitez définir le type de contenu pour indiquer à l'API qu'il s'agit de JSON.
byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
Ensuite, vous pouvez envoyer votre demande très similaire à votre exemple précédent avec le contenu du formulaire:
var result = client.PostAsync("", byteContent).Result
Sur une note secondaire, appeler la
.Result
propriété comme vous le faites ici peut avoir des effets secondaires négatifs tels que le verrouillage mort, vous devez donc être prudent avec cela.la source
POST, PUT, DELETE
est effectué, généralement le retour APITRUE
, j'ai déclaré la méthode commestring
, mais quand je le fais:return result;
j'obtiens:,Can't Convert HttpResponseMessage in string
dois-je changer la déclaration de méthode? J'ai besoin de la réponse de la chaîne car je devrai la désérialiser après dans une autre méthode de classe.result.Content.ReadAsStringAsync()
) est probablement très bien. En fonction de la structure de votre application, il peut être préférable de renvoyer l'Content
objet directement si vous devez inspecter les en-têtes pour déterminer le type de contenu (par exemple, XML ou JSON). Mais si vous savez que cela retournera toujours JSON (ou un autre format), renvoyer simplement le corps de la réponse sous forme de chaîne devrait être correct.StringContent
?StringContent
directement àPostAsync
car il dériveHttpContent
.Vous devez transmettre vos données dans le corps de la requête sous forme de chaîne brute plutôt que
FormUrlEncodedContent
. Une façon de le faire est de le sérialiser dans une chaîne JSON:var json = JsonConvert.SerializeObject(data); // or JsonSerializer.Serialize if using System.Text.Json
Il ne vous reste plus qu'à transmettre la chaîne à la méthode 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);
la source
stringContent
? Dans mon cas, lastringContent
valeur est"\"\""
. Cette valeur est-elle correcte?Une solution simple consiste à utiliser
Microsoft ASP.NET Web API 2.2 Client
depuis NuGet .Ensuite, vous pouvez simplement le faire et cela sérialisera l'objet en JSON et définira l'en-
Content-Type
tête surapplication/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);
la source
Il existe maintenant un moyen plus simple avec
.NET Standard
ou.NET Core
:var client = new HttpClient(); var response = await client.PostAsync(uri, myRequestObject, new JsonMediaTypeFormatter());
REMARQUE: pour utiliser la
JsonMediaTypeFormatter
classe, vous devrez installer leMicrosoft.AspNet.WebApi.Client
package NuGet, qui peut être installé directement, ou via un autre tel queMicrosoft.AspNetCore.App
.En utilisant cette signature de
HttpClient.PostAsync
, vous pouvez passer n'importe quel objet et leJsonMediaTypeFormatter
s'occupera automatiquement de la sérialisation, etc.Avec la réponse, vous pouvez utiliser
HttpContent.ReadAsAsync<T>
pour désérialiser le contenu de la réponse au type que vous attendez:var responseObject = await response.Content.ReadAsAsync<MyResponseType>();
la source
.NET Standard
ou.NET Core
, comme je l'ai mentionné. Peut-être que vous utilisez.NET Framework
? Dans mon projet, le JsonMediaTypeFormatter est chargé à partir d'ici: C: \ Program Files \ dotnet \ sdk \ NuGetFallbackFolder \ microsoft.aspnet.webapi.client \ 5.2.6 \ lib \ netstandard2.0 \ System.Net.Http.Formatting. dll