Berikut kode yang saya gunakan:
// create a request
HttpWebRequest request = (HttpWebRequest)
WebRequest.Create(url); request.KeepAlive = false;
request.ProtocolVersion = HttpVersion.Version10;
request.Method = "POST";
// turn our request string into a byte stream
byte[] postBytes = Encoding.UTF8.GetBytes(json);
// this is important - make sure you specify type this way
request.ContentType = "application/json; charset=UTF-8";
request.Accept = "application/json";
request.ContentLength = postBytes.Length;
request.CookieContainer = Cookies;
request.UserAgent = currentUserAgent;
Stream requestStream = request.GetRequestStream();
// now send it
requestStream.Write(postBytes, 0, postBytes.Length);
requestStream.Close();
// grab te response and print it out to the console along with the status code
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string result;
using (StreamReader rdr = new StreamReader(response.GetResponseStream()))
{
result = rdr.ReadToEnd();
}
return result;
Ketika saya menjalankan ini, saya selalu mendapatkan 500 kesalahan server internal.
Apa yang saya lakukan salah?
c#
json
post
httpwebrequest
Arsen Zahray
sumber
sumber
Jawaban:
Cara saya melakukannya dan berfungsi adalah:
Saya menulis perpustakaan untuk melakukan tugas ini dengan cara yang lebih sederhana, ada di sini: https://github.com/ademargomes/JsonRequest
Semoga ini bisa membantu.
sumber
Solusi Ademar dapat ditingkatkan dengan leveraging
JavaScriptSerializer
'sSerialize
metode untuk memberikan konversi implisit dari objek untuk JSON.Selain itu, dimungkinkan untuk memanfaatkan
using
fungsionalitas default pernyataan untuk menghilangkan panggilanFlush
danClose
.sumber
application/json
yang benar.The
HttpClient
jenis adalah implementasi lebih baru daripadaWebClient
danHttpWebRequest
.Anda cukup menggunakan baris berikut.
Ketika Anda membutuhkan
HttpClient
lebih dari sekali, disarankan untuk hanya membuat satu instance dan menggunakannya kembali atau gunakan yang baruHttpClientFactory
.sumber
HttpClientFactory
. Saya tidak membaca semua jawaban dalam masalah terkait tetapi saya pikir ini perlu diperbarui karena tidak menyebutkan pabrik.Lebih jauh ke pos Sean, tidak perlu menyarang pernyataan penggunaan. Oleh
using
StreamWriter ia akan memerah dan ditutup pada akhir blok sehingga tidak perlu secara eksplisit memanggil metodeFlush()
danClose()
:sumber
Jika Anda perlu menelepon secara tidak sinkron maka gunakan
sumber
postStream.Write(postData);
- dan tergantung pada API, mungkin harus menggunakanrequest.ContentType = "application/json";
bukantext/json
.Jaga Jenis-Konten yang Anda gunakan:
Sumber:
RFC4627
Pos lainnya
sumber
Saya baru-baru ini datang dengan cara yang lebih sederhana untuk memposting JSON, dengan langkah tambahan mengkonversi dari model di aplikasi saya. Perhatikan bahwa Anda harus membuat model [JsonObject] untuk pengontrol Anda untuk mendapatkan nilai dan melakukan konversi.
Permintaan:
Model:
Sisi server:
sumber
Opsi ini tidak disebutkan:
sumber
Beberapa cara berbeda dan bersih untuk mencapai ini adalah dengan menggunakan HttpClient seperti ini:
sumber
PostAsJsonAsync
tidak lagi tersedia sejak .NET 4.5.2. GunakanPostAsync
sebagai gantinya. Lebih lanjut di siniusing
pernyataan seperti iniIDisposable
antarmuka karena suatu alasanPERINGATAN! Saya memiliki pandangan yang sangat kuat tentang masalah ini.
Klien web .NET yang ada tidak ramah terhadap pengembang! WebRequest & WebClient adalah contoh utama "bagaimana menggagalkan pengembang". Mereka verbose & rumit untuk dikerjakan; ketika semua yang ingin Anda lakukan adalah permintaan Posting sederhana dalam C #. HttpClient melakukan beberapa cara dalam mengatasi masalah ini, tetapi masih gagal. Di atas semua itu, dokumentasi Microsoft buruk ... sangat buruk; kecuali jika Anda ingin menyaring halaman dan halaman dari uraian teknis.
Sumber terbuka untuk penyelamatan. Ada tiga sumber terbuka, perpustakaan NuGet gratis yang sangat baik sebagai alternatif. Untunglah! Ini semua didukung, didokumentasikan dan ya, mudah - koreksi ... super mudah - untuk bekerja dengannya.
Tidak ada banyak di antara mereka, tapi saya akan memberikan ServiceStack.
Oke - jadi seperti apa tampilan Permintaan Posting di JSON di dalam ServiceStack.Text?
Itu adalah satu baris kode. Ringkas & mudah! Bandingkan hal di atas dengan pustaka Http .NET.
sumber
Saya akhirnya dipanggil dalam mode sinkronisasi dengan memasukkan .Result
sumber
var data = Encoding.ASCII.GetBytes(json);
byte[] postBytes = Encoding.UTF8.GetBytes(json);
Gunakan ASCII bukan UFT8
sumber