.NET: Cara paling sederhana untuk mengirim POST dengan data dan membaca respons

179

Yang mengejutkan saya, saya tidak dapat melakukan apapun yang sesederhana ini, dari apa yang dapat saya katakan, di .NET BCL:

byte[] response = Http.Post
(
    url: "http://dork.com/service",
    contentType: "application/x-www-form-urlencoded",
    contentLength: 32,
    content: "home=Cosby&favorite+flavor=flies"
);

Kode hipotetis di atas membuat HTTP POST, dengan data, dan mengembalikan respons dari a Post metode pada kelas statis Http.

Karena kita dibiarkan tanpa sesuatu semudah ini, apa solusi terbaik berikutnya?

Bagaimana cara mengirim POST HTTP dengan data DAN mendapatkan konten tanggapan?

AgileMeansDoAsLittleAsPossible
sumber
Ini sebenarnya bekerja dengan baik untuk saya ... stickler.de/en/information/code-snippets/…
Jamie Tabone

Jawaban:

288
   using (WebClient client = new WebClient())
   {

       byte[] response =
       client.UploadValues("http://dork.com/service", new NameValueCollection()
       {
           { "home", "Cosby" },
           { "favorite+flavor", "flies" }
       });

       string result = System.Text.Encoding.UTF8.GetString(response);
   }

Anda akan membutuhkan ini termasuk:

using System;
using System.Collections.Specialized;
using System.Net;

Jika Anda ngotot menggunakan metode / kelas statis:

public static class Http
{
    public static byte[] Post(string uri, NameValueCollection pairs)
    {
        byte[] response = null;
        using (WebClient client = new WebClient())
        {
            response = client.UploadValues(uri, pairs);
        }
        return response;
    }
}

Maka cukup:

var response = Http.Post("http://dork.com/service", new NameValueCollection() {
    { "home", "Cosby" },
    { "favorite+flavor", "flies" }
});
Chris Hutchinson
sumber
3
Jika Anda ingin kontrol lebih besar atas tajuk HTTP, Anda bisa mencoba yang sama menggunakan HttpWebRequest dan referensi RFC2616 ( w3.org/Protocols/rfc2616/rfc2616.txt ). Jawaban dari jball dan BFree ikuti upaya itu.
Chris Hutchinson
9
Contoh ini sebenarnya tidak membaca respons, yang merupakan bagian penting dari pertanyaan awal!
Jon Watte
4
Untuk membaca jawabannya, Anda bisa melakukannya string result = System.Text.Encoding.UTF8.GetString(response). Ini adalah pertanyaan di mana saya menemukan jawabannya.
jporcenaluk
Metode ini tidak lagi berfungsi jika Anda mencoba membangun aplikasi Windows Store untuk Windows 8.1, karena WebClient tidak ditemukan di System.Net. Alih-alih, gunakan jawaban Ramesh dan perhatikan penggunaan "menunggu."
Stephen Wylie
2
Saya akan menambahkan satu ini, tetapi Anda harus memasukkan komentar @ jporcenaluk tentang membaca respons untuk meningkatkan jawaban Anda.
Corgalore
78

Menggunakan HttpClient: sejauh menyangkut pengembangan aplikasi Windows 8, saya menemukan ini.

var client = new HttpClient();

var pairs = new List<KeyValuePair<string, string>>
    {
        new KeyValuePair<string, string>("pqpUserName", "admin"),
        new KeyValuePair<string, string>("password", "test@123")
    };

var content = new FormUrlEncodedContent(pairs);

var response = client.PostAsync("youruri", content).Result;

if (response.IsSuccessStatusCode)
{


}
Ramesh
sumber
6
Juga berfungsi dengan Kamus <String, String>, yang membuatnya lebih bersih.
Peter Hedberg
23
JAWABAN TERBAIK YANG PERNAH .. Oh terima kasih kepada tuan, terima kasih aku mencintaimu. Saya telah berjuang .. 2 MINGGU FREAKNG .. Anda harus melihat semua posting saya. ARGHH PERUSAHAAN BEKERJA, YEHAAA <hugs>
Jimmyt1988
1
Perhatikan bahwa, bila memungkinkan, Anda tidak harus menggunakan .Resultdengan Asyncpanggilan - penggunaan awaituntuk memastikan thread UI Anda tidak akan memblokir. Juga, sederhana new[]akan berfungsi serta Daftar; Kamus dapat membersihkan kode, tetapi akan mengurangi beberapa fungsi HTTP.
Matt DeKrey
1
Saat ini (2016) yang satu ini adalah jawaban terbaik. HttpClient lebih baru daripada WebClient (jawaban terbanyak) dan memiliki beberapa manfaat di antaranya: 1) Ia memiliki model pemrograman async yang baik yang sedang dikerjakan oleh Henrik F Nielson yang pada dasarnya adalah salah satu penemu HTTP, dan ia merancang API sehingga mudah bagi Anda untuk mengikuti standar HTTP; 2) Didukung oleh .Net framework 4.5, sehingga memiliki beberapa tingkat dukungan yang dijamin untuk masa depan yang dapat dilupakan; 3) Ini juga memiliki versi pustaka xcopyable / portable-framework perpustakaan jika Anda ingin menggunakannya di platform lain -. Net 4.0, Windows Phone dll ...
Luis Gouveia
cara mengirim file dengan httpclient
Darshan Dave
47

Gunakan WebRequest . Dari Scott Hanselman :

public static string HttpPost(string URI, string Parameters) 
{
   System.Net.WebRequest req = System.Net.WebRequest.Create(URI);
   req.Proxy = new System.Net.WebProxy(ProxyString, true);
   //Add these, as we're doing a POST
   req.ContentType = "application/x-www-form-urlencoded";
   req.Method = "POST";
   //We need to count how many bytes we're sending. 
   //Post'ed Faked Forms should be name=value&
   byte [] bytes = System.Text.Encoding.ASCII.GetBytes(Parameters);
   req.ContentLength = bytes.Length;
   System.IO.Stream os = req.GetRequestStream ();
   os.Write (bytes, 0, bytes.Length); //Push it out there
   os.Close ();
   System.Net.WebResponse resp = req.GetResponse();
   if (resp== null) return null;
   System.IO.StreamReader sr = 
         new System.IO.StreamReader(resp.GetResponseStream());
   return sr.ReadToEnd().Trim();
}
jball
sumber
32
private void PostForm()
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://dork.com/service");
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    string postData ="home=Cosby&favorite+flavor=flies";
    byte[] bytes = Encoding.UTF8.GetBytes(postData);
    request.ContentLength = bytes.Length;

    Stream requestStream = request.GetRequestStream();
    requestStream.Write(bytes, 0, bytes.Length);

    WebResponse response = request.GetResponse();
    Stream stream = response.GetResponseStream();
    StreamReader reader = new StreamReader(stream);

    var result = reader.ReadToEnd();
    stream.Dispose();
    reader.Dispose();
}
BFree
sumber
12

Secara pribadi, saya pikir pendekatan paling sederhana untuk melakukan posting http dan mendapatkan respons adalah dengan menggunakan kelas WebClient. Kelas ini dengan baik mengabstraksi detailnya. Bahkan ada contoh kode lengkap dalam dokumentasi MSDN.

http://msdn.microsoft.com/en-us/library/system.net.webclient(VS.80).aspx

Dalam kasus Anda, Anda menginginkan metode UploadData (). (Sekali lagi, contoh kode dimasukkan dalam dokumentasi)

http://msdn.microsoft.com/en-us/library/tdbbwh0a(VS.80).aspx

UploadString () mungkin akan berfungsi juga, dan abstrak itu satu tingkat lagi.

http://msdn.microsoft.com/en-us/library/system.net.webclient.uploadstring(VS.80).aspx

David
sumber
+1 Saya menduga ada banyak cara untuk melakukan ini dalam framework.
jball
7

Saya tahu ini adalah utas lama, tetapi harap ini membantu seseorang.

public static void SetRequest(string mXml)
{
    HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.CreateHttp("http://dork.com/service");
    webRequest.Method = "POST";
    webRequest.Headers["SOURCE"] = "WinApp";

    // Decide your encoding here

    //webRequest.ContentType = "application/x-www-form-urlencoded";
    webRequest.ContentType = "text/xml; charset=utf-8";

    // You should setContentLength
    byte[] content = System.Text.Encoding.UTF8.GetBytes(mXml);
    webRequest.ContentLength = content.Length;

    var reqStream = await webRequest.GetRequestStreamAsync();
    reqStream.Write(content, 0, content.Length);

    var res = await httpRequest(webRequest);
}
Murali
sumber
Apa itu httpRequest? Ini memberi saya kesalahan "Tidak ada".
Rahul Khandelwal
6

Mengingat jawaban lain berusia beberapa tahun, saat ini inilah pemikiran saya yang mungkin membantu:

Cara paling sederhana

private async Task<string> PostAsync(Uri uri, HttpContent dataOut)
{
    var client = new HttpClient();
    var response = await client.PostAsync(uri, dataOut);
    return await response.Content.ReadAsStringAsync();
    // For non strings you can use other Content.ReadAs...() method variations
}

Contoh yang Lebih Praktis

Seringkali kita berhadapan dengan tipe dan JSON yang dikenal, sehingga Anda dapat memperluas ide ini dengan sejumlah implementasi, seperti:

public async Task<T> PostJsonAsync<T>(Uri uri, object dtoOut)
{
    var content = new StringContent(JsonConvert.SerializeObject(dtoOut));
    content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");

    var results = await PostAsync(uri, content); // from previous block of code

    return JsonConvert.DeserializeObject<T>(results); // using Newtonsoft.Json
}

Contoh bagaimana ini bisa disebut:

var dataToSendOutToApi = new MyDtoOut();
var uri = new Uri("https://example.com");
var dataFromApi = await PostJsonAsync<MyDtoIn>(uri, dataToSendOutToApi);
ToddBFisher
sumber
5

Anda dapat menggunakan sesuatu seperti kode pseudo ini:

request = System.Net.HttpWebRequest.Create(your url)
request.Method = WebRequestMethods.Http.Post

writer = New System.IO.StreamWriter(request.GetRequestStream())
writer.Write("your data")
writer.Close()

response = request.GetResponse()
reader = New System.IO.StreamReader(response.GetResponseStream())
responseText = reader.ReadToEnd
paludarium
sumber