Hvordan sender jeg et objekt til HttpClient.PostAsync og serialiserer som en JSON-kropp?

 C Programming >> C C# Program >  >> C#
Hvordan sender jeg et objekt til HttpClient.PostAsync og serialiserer som en JSON-kropp?

Det rette svaret på spørsmålet ditt er:Nei. Signaturen for PostAsync metoden er som følger:

Så mens du kan sende en object til PostAsync den må være av typen HttpContent og den anonyme typen din oppfyller ikke disse kriteriene.

Det finnes imidlertid måter å oppnå det du ønsker å oppnå. Først må du serialisere din anonyme type til JSON, det vanligste verktøyet for dette er Json.NET. Og koden for dette er ganske triviell:

var myContent = JsonConvert.SerializeObject(data);

Deretter må du konstruere et innholdsobjekt for å sende disse dataene, jeg vil bruke en ByteArrayContent objekt, men du kan bruke eller lage en annen type hvis du vil.

var buffer = System.Text.Encoding.UTF8.GetBytes(myContent);
var byteContent = new ByteArrayContent(buffer);

Deretter vil du angi innholdstypen for å fortelle API-en at dette er JSON.

byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");

Deretter kan du sende forespørselen din veldig lik det forrige eksempelet ditt med skjemainnholdet:

var result = client.PostAsync("", byteContent).Result

På en sidenotat, ring .Result eiendom som du gjør her kan ha noen dårlige bivirkninger som dødlåsing, så du bør være forsiktig med dette.


Du må sende dataene dine i forespørselsteksten som en råstreng i stedet for FormUrlEncodedContent . En måte å gjøre det på er å serialisere den til en JSON-streng:

var json = JsonConvert.SerializeObject(data); // or JsonSerializer.Serialize if using System.Text.Json

Nå er alt du trenger å gjøre å sende strengen til postmetoden.

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);

En enkel løsning er å bruke Microsoft ASP.NET Web API 2.2 Client fra NuGet.

Deretter kan du ganske enkelt gjøre dette, og det vil serialisere objektet til JSON og sette Content-Type overskriften til application/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);