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