Lebih
Cara membuat HTTP POST permintaan web
Kanonik
*Bagaimana saya dapat membuat permintaan HTTP dan mengirim beberapa data menggunakanPOST
metode?**
Yang bisa saya lakukan MENDAPATKAN
permintaan tapi tidak memiliki ide bagaimana untuk membuat POST
.
1020
11
Ada beberapa cara untuk melakukan HTTP
MENDAPATKAN
danPOST
permintaan:Metode: HttpClient (Lebih Disukai)
Ini adalah pembungkus sekitar
HttpWebRequest
. Bandingkan denganWebClient
.Tersedia di:
.NET Framework 4.5+
,.NET Standar 1.1+
,.NET Core 1.0+
.Saat ini, pendekatan yang lebih disukai. Asynchronous. Versi portabel untuk platform lain akan tersedia melalui NuGet.
Setup
Itu adalah recommended untuk instantiate satu
HttpClient
untuk aplikasi anda's seumur hidup dan berbagi.Lihat
HttpClientFactory
untuk Ketergantungan larutan Injeksi.POST
var nilai = baru Kamus<string, string> { { "thing1", "hello" }, { "thing2", "dunia" } };
var isi = new FormUrlEncodedContent(nilai-nilai);
var response = menunggu klien.PostAsync("http://www.example.com/recepticle.aspx", konten);
var responseString = menunggu respon.Konten.ReadAsStringAsync();
GET
var responseString = menunggu klien.GetStringAsync("http://www.example.com/recepticle.aspx");
Metode B: Pihak ke-3 Perpustakaan
Dicoba dan diuji perpustakaan untuk berinteraksi dengan REST Api. Portabel. Tersedia melalui NuGet.
Baru perpustakaan olahraga yang menguasai API dan pengujian pembantu. HttpClient di bawah tenda. Portabel. Tersedia melalui NuGet.
menggunakan Flurl.Http;
POST
var responseString = menunggu "http://www.example.com/recepticle.aspx" .PostUrlEncodedAsync(baru { thing1 = "hello", thing2 = "dunia" }) .ReceiveString();
GET
var responseString = menunggu "http://www.example.com/recepticle.aspx" .GetStringAsync();
Metode C: HttpWebRequest (Tidak dianjurkan untuk pekerjaan baru)
Tersedia di:
.NET Framework 1.1+
,.NET 2.0 Standar+
,.NET Core 1.0+
POST
var request = (HttpWebRequest)WebRequest.Membuat("http://www.example.com/recepticle.aspx");
var postData = "thing1=" + Uri.EscapeDataString("hello"); postData += "&thing2=" + Uri.EscapeDataString("dunia"); var data = Encoding.ASCII.GetBytes(postData);
permintaan.Metode = "POST"; permintaan.ContentType = "application/x-www-form-urlencoded"; permintaan.ContentLength = data.Panjang;
menggunakan (var stream = permintaan.GetRequestStream()) { stream.Write(data, 0, data.Panjang); }
var response = (HttpWebResponse)permintaan.GetResponse();
var responseString = new StreamReader(respon.GetResponseStream()).ReadToEnd();
GET
var request = (HttpWebRequest)WebRequest.Membuat("http://www.example.com/recepticle.aspx");
var response = (HttpWebResponse)permintaan.GetResponse();
var responseString = new StreamReader(respon.GetResponseStream()).ReadToEnd();
Metode D: WebClient (Tidak dianjurkan untuk pekerjaan baru)
Ini adalah pembungkus sekitar
HttpWebRequest
. Bandingkan denganHttpClient
.Tersedia di:
.NET Framework 1.1+
,BERSIH Standar 2.0+
,.NET Core 2.0+
POST
menggunakan (var client = new WebClient()) { var nilai = new NameValueCollection(); nilai-nilai["thing1"] = "hello"; nilai-nilai["thing2"] = "dunia";
var response = klien.UploadValues("http://www.example.com/recepticle.aspx", nilai);
var responseString = Encoding.Default.GetString(response); }
GET
menggunakan (var client = new WebClient()) { var responseString = klien.DownloadString("http://www.example.com/recepticle.aspx"); }
Sederhana MENDAPATKAN permintaan
Sederhana permintaan POST
MEDIA memiliki sampel.
Ini adalah kerja lengkap contoh mengirim/menerima data dalam format JSON, saya digunakan VS2013 Express Edition
Ada beberapa benar-benar jawaban yang baik di di sini. Biarkan saya posting cara yang berbeda untuk mengatur header dengan WebClient(). Saya juga akan menunjukkan kepada anda bagaimana untuk mengatur sebuah API key.
Sederhana (one-liner, tidak memeriksa kesalahan, tidak menunggu respon) larutan i've ditemukan sejauh ini
gunakan dengan hati-hati!
Solusi ini menggunakan apa-apa tapi standar .Panggilan NET.
Diuji:
Referensi:
Kode:
Untuk memanggil dengan parameter tidak (menggunakan "MENDAPATKAN" di belakang layar):
Untuk memanggil dengan parameter (menggunakan "POST" di belakang layar):
Ketika menggunakan Windows.Web.Http namespace, untuk POSTING bukan FormUrlEncodedContent kita menulis HttpFormUrlEncodedContent. Juga respon adalah jenis HttpResponseMessage. Sisanya adalah sebagai Evan Mulawski menulis.
Anda dapat menggunakan IEnterprise.Mudah-HTTP sejak itu telah dibangun di kelas parsing dan query bangunan:
I'm penulis dari perpustakaan sehingga merasa bebas untuk mengajukan pertanyaan atau periksa kode di github
Jika anda suka menguasai API anda dapat menggunakan Kecil.RestClient. It's tersedia di Nuget
Harapan yang membantu!
Mengapa hal ini tidak benar-benar sepele ? melakukan permintaan tidak dan terutama tidak berurusan dengan hasil-hasil dan sepertinya ada beberapa .NET bug yang terlibat serta - lihat https://social.msdn.microsoft.com/Forums/en-US/d8d87789-0ac9-4294-84a0-91c9fa27e353/bug-in-httpclientgetasync-should-throw-webexception-not-taskcanceledexception?forum=netfxnetcom
Saya berakhir dengan kode ini:
`` statis async Task<(bool Sukses, WebExceptionStatus WebExceptionStatus, HttpStatusCode? HttpStatusCode, string ResponseAsString)> HttpRequestAsync(HttpClient httpClient, string url, string postBuffer = null, CancellationTokenSource cts = null) { try { HttpResponseMessage resp = null;
jika (postBuffer null) { resp = cts adalah null ? menanti httpClient.GetAsync(url) : menanti httpClient.GetAsync(url, cts.Token);
} else { menggunakan (var httpContent = new StringContent(postBuffer)) { resp = cts adalah null ? menanti httpClient.PostAsync(url, httpContent) : menanti httpClient.PostAsync(url, httpContent, cts.Token); } }
var respString = menunggu resp.Konten.ReadAsStringAsync(); kembali (resp.IsSuccessStatusCode, WebExceptionStatus.Sukses, resp.StatusCode, respString);
} catch (WebException ex) { WebExceptionStatus status = ex.Status; if (status == WebExceptionStatus.ProtocolError) { // Mendapatkan HttpWebResponse sehingga anda dapat memeriksa kode status HTTP. menggunakan (HttpWebResponse httpResponse = (HttpWebResponse)ex.Response) { return (false, status, httpResponse.StatusCode, httpResponse.StatusDescription); } } else { return (false, status, null, ex.ToString()); }
} catch (TaskCanceledException ex) { jika (ex.CancellationToken == cts.Token) { // nyata pembatalan, dipicu oleh pemanggil return (false, WebExceptionStatus.RequestCanceled, null, ex.ToString()); } else { // web request timeout (mungkin hal-hal lain!?) return (false, WebExceptionStatus.Timeout, null, ex.ToString()); }
} catch (Exception ex) { return (false, WebExceptionStatus.UnknownError, null, ex.ToString()); } } ``
Ini akan melakukan GET atau POST tergantung jika
postBuffer
adalah null atau tidakjika Kesuksesan adalah benar respon yang kemudian akan di
ResponseAsString
jika Sukses adalah palsu anda dapat memeriksa
WebExceptionStatus
,HttpStatusCode
danResponseAsString
untuk mencoba untuk melihat apa yang salah.Saya menyambut komentar tentang hal ini karena saya masih tidak yakin ini mencakup semua kasus.