Saya menggunakan System.Net.Http
, saya menemukan beberapa contoh di web. Saya berhasil membuat kode ini untuk membuat POST
permintaan:
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;
}
}
semua bekerja dengan baik. Tetapi misalkan saya ingin meneruskan parameter ketiga ke POST
metode, parameter dipanggil data
. Parameter data adalah objek seperti ini:
object data = new
{
name = "Foo",
category = "article"
};
bagaimana saya bisa melakukannya tanpa membuat KeyValuePair
? Php saya RestAPI
menunggu masukan json, jadi FormUrlEncodedContent
harus mengirim raw
json dengan benar. Tapi bagaimana saya bisa melakukan ini Microsoft.Net.Http
? Terima kasih.
c#
json
dotnet-httpclient
IlDrugo
sumber
sumber
using
untukHttpClient
. aspnetmonsters.com/2016/08/2016-08-27-httpclientwrongusing
tidak boleh digunakan: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/…Jawaban:
Jawaban langsung atas pertanyaan Anda adalah: Tidak. Tanda tangan untuk
PostAsync
metode ini adalah sebagai berikut:Jadi, meskipun Anda dapat meneruskan
object
kePostAsync
itu, haruslah tipeHttpContent
dan tipe anonim Anda tidak memenuhi kriteria itu.Namun, ada cara untuk mencapai apa yang ingin Anda capai. Pertama, Anda perlu membuat serial tipe anonim Anda ke JSON, alat yang paling umum untuk ini adalah Json.NET . Dan kode untuk ini cukup sepele:
var myContent = JsonConvert.SerializeObject(data);
Selanjutnya, Anda perlu membuat objek konten untuk mengirim data ini, saya akan menggunakan
ByteArrayContent
objek, tetapi Anda dapat menggunakan atau membuat jenis yang berbeda jika Anda mau.var buffer = System.Text.Encoding.UTF8.GetBytes(myContent); var byteContent = new ByteArrayContent(buffer);
Selanjutnya, Anda ingin menyetel tipe konten agar API mengetahui bahwa ini adalah JSON.
byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
Kemudian Anda dapat mengirim permintaan Anda sangat mirip dengan contoh Anda sebelumnya dengan isi formulir:
var result = client.PostAsync("", byteContent).Result
Di samping catatan, menelepon
.Result
properti seperti yang Anda lakukan di sini dapat memiliki beberapa efek samping yang buruk seperti dead locking, jadi Anda harus berhati-hati dengan ini.sumber
POST, PUT, DELETE
dilakukan, biasanya API kembaliTRUE
, saya menyatakan metode sebagaistring
, tetapi ketika saya melakukannya:return result;
Saya mendapatkan:,Can't Convert HttpResponseMessage in string
haruskah saya mengubah deklarasi metode? Saya memerlukan respons string karena saya harus melakukan deserialisasi setelah di metode kelas lain.result.Content.ReadAsStringAsync()
) mungkin tidak masalah. Bergantung pada struktur aplikasi Anda, mungkin lebih baik mengembalikanContent
objek secara langsung jika Anda perlu memeriksa header untuk menentukan jenis konen (mis. XML atau JSON). Tetapi jika Anda tahu itu selalu akan mengembalikan JSON (atau format lain) maka hanya mengembalikan isi respons sebagai string seharusnya tidak apa-apa.StringContent
?StringContent
langsung kePostAsync
karena itu berasal dariHttpContent
.Anda harus meneruskan data Anda di badan permintaan sebagai string mentah, bukan
FormUrlEncodedContent
. Salah satu cara untuk melakukannya adalah dengan membuat serialnya menjadi string JSON:var json = JsonConvert.SerializeObject(data); // or JsonSerializer.Serialize if using System.Text.Json
Sekarang yang perlu Anda lakukan adalah meneruskan string ke metode posting.
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);
sumber
stringContent
? Dalam kasus saya,stringContent
nilainya adalah"\"\""
. Apakah ini nilai yang benar?Solusi sederhana adalah dengan menggunakan
Microsoft ASP.NET Web API 2.2 Client
dari NuGet .Kemudian Anda cukup melakukan ini dan itu akan membuat serial objek ke JSON dan mengatur
Content-Type
header keapplication/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);
sumber
Sekarang ada cara yang lebih sederhana dengan
.NET Standard
atau.NET Core
:var client = new HttpClient(); var response = await client.PostAsync(uri, myRequestObject, new JsonMediaTypeFormatter());
CATATAN: Untuk menggunakan
JsonMediaTypeFormatter
kelas tersebut, Anda perlu menginstalMicrosoft.AspNet.WebApi.Client
paket NuGet, yang dapat diinstal secara langsung, atau melalui yang lain sepertiMicrosoft.AspNetCore.App
.Dengan menggunakan tanda tangan ini
HttpClient.PostAsync
, Anda dapat mengirimkan objek apa pun danJsonMediaTypeFormatter
secara otomatis akan mengurus serialisasi, dll.Dengan respons tersebut, Anda dapat menggunakan
HttpContent.ReadAsAsync<T>
untuk menghentikan konten respons ke jenis yang Anda harapkan:var responseObject = await response.Content.ReadAsAsync<MyResponseType>();
sumber
.NET Standard
atau.NET Core
, seperti yang saya sebutkan. Mungkin Anda menggunakan.NET Framework
? Dalam proyek saya, JsonMediaTypeFormatter sedang dimuat dari sini: C: \ Program Files \ dotnet \ sdk \ NuGetFallbackFolder \ microsoft.aspnet.webapi.client \ 5.2.6 \ lib \ netstandard2.0 \ System.Net.Http.Formatting. dll