Używam System.Net.Http
, znalazłem kilka przykładów w sieci. Udało mi się stworzyć ten kod do złożenia POST
wniosku:
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;
}
}
wszystko działa dobrze. Ale przypuśćmy, że chcę przekazać POST
metodzie trzeci parametr , tzw data
. Param danych to taki obiekt:
object data = new
{
name = "Foo",
category = "article"
};
jak mogę to zrobić bez tworzenia KeyValuePair
? Mój php RestAPI
czeka na wejście json, więc FormUrlEncodedContent
powinien raw
poprawnie wysłać json. Ale jak mam to zrobić Microsoft.Net.Http
? Dzięki.
c#
json
dotnet-httpclient
IlDrugo
źródło
źródło
using
dlaHttpClient
. aspnetmonsters.com/2016/08/2016-08-27-httpclientwrongusing
nie należy jej używać: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/ ...Odpowiedzi:
Prosta odpowiedź na twoje pytanie brzmi: Nie. Podpis
PostAsync
metody jest następujący:Tak więc, chociaż możesz przekazać
object
doPostAsync
, musi być typu,HttpContent
a twój anonimowy typ nie spełnia tych kryteriów.Istnieją jednak sposoby na osiągnięcie tego, co chcesz osiągnąć. Najpierw musisz serializować swój anonimowy typ do formatu JSON, najczęściej używanym narzędziem do tego jest Json.NET . A kod do tego jest dość trywialny:
var myContent = JsonConvert.SerializeObject(data);
Następnie będziesz musiał skonstruować obiekt treści, aby wysłać te dane, użyję
ByteArrayContent
obiektu, ale możesz użyć lub utworzyć inny typ, jeśli chcesz.var buffer = System.Text.Encoding.UTF8.GetBytes(myContent); var byteContent = new ByteArrayContent(buffer);
Następnie chcesz ustawić typ zawartości, aby interfejs API wiedział, że to JSON.
byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
Następnie możesz wysłać zapytanie bardzo podobne do poprzedniego przykładu z treścią formularza:
var result = client.PostAsync("", byteContent).Result
Na marginesie, wywołanie
.Result
właściwości, tak jak tutaj, może mieć złe skutki uboczne, takie jak martwe blokowanie, więc chcesz zachować ostrożność.źródło
POST, PUT, DELETE
wykonywany jest a , zwykle zwraca APITRUE
, zadeklarowałem metodę jakostring
, ale kiedy to zrobię:return result;
Otrzymuję:,Can't Convert HttpResponseMessage in string
czy powinienem zmienić deklarację metody? Potrzebuję odpowiedzi w postaci ciągu znaków, ponieważ będę musiał ją deserializować w innej metodzie klasy.result.Content.ReadAsStringAsync()
), prawdopodobnie jest w porządku. W zależności od struktury aplikacji, może być lepiej zwrócićContent
obiekt bezpośrednio, jeśli chcesz sprawdzić nagłówki, aby określić, jaki jest typ treści (np. XML lub JSON). Ale jeśli wiesz, że zawsze zwróci JSON (lub inny format), po prostu zwróć treść odpowiedzi jako ciąg znaków.StringContent
?StringContent
bezpośrednio do,PostAsync
ponieważ pochodzi zHttpContent
.Musisz przekazać swoje dane w treści żądania jako nieprzetworzony ciąg, a nie
FormUrlEncodedContent
. Jednym ze sposobów jest serializowanie go do ciągu JSON:var json = JsonConvert.SerializeObject(data); // or JsonSerializer.Serialize if using System.Text.Json
Teraz wszystko, co musisz zrobić, to przekazać ciąg znaków do metody 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);
źródło
stringContent
? W moim przypadkustringContent
wartość to"\"\""
. Czy to poprawna wartość?Prostym rozwiązaniem jest użycie
Microsoft ASP.NET Web API 2.2 Client
z NuGet .Następnie możesz po prostu to zrobić, a serializuje obiekt do JSON i ustawia
Content-Type
nagłówek naapplication/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);
źródło
Jest teraz prostszy sposób z
.NET Standard
lub.NET Core
:var client = new HttpClient(); var response = await client.PostAsync(uri, myRequestObject, new JsonMediaTypeFormatter());
UWAGA: Aby użyć
JsonMediaTypeFormatter
klasy, musisz zainstalowaćMicrosoft.AspNet.WebApi.Client
pakiet NuGet, który można zainstalować bezpośrednio lub za pośrednictwem innego, takiego jakMicrosoft.AspNetCore.App
.Za pomocą tego podpisu
HttpClient.PostAsync
możesz przekazać dowolny obiekt, aJsonMediaTypeFormatter
wola automatycznie zajmie się serializacją itp.Za pomocą odpowiedzi możesz
HttpContent.ReadAsAsync<T>
deserializować zawartość odpowiedzi do oczekiwanego typu:var responseObject = await response.Content.ReadAsAsync<MyResponseType>();
źródło
.NET Standard
lub.NET Core
, jak wspomniałem. Może używasz.NET Framework
? W moim projekcie JsonMediaTypeFormatter jest ładowany stąd: C: \ Program Files \ dotnet \ sdk \ NuGetFallbackFolder \ microsoft.aspnet.webapi.client \ 5.2.6 \ lib \ netstandard2.0 \ System.Net.Http.Formatting. dll