.NET: Cách đơn giản nhất để gửi POST với dữ liệu và đọc phản hồi


179

Thật ngạc nhiên, tôi không thể làm bất cứ điều gì đơn giản như thế này, từ những gì tôi có thể nói, trong .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"
);

Mã giả thuyết ở trên tạo ra HTTP POST, với dữ liệu và trả về phản hồi từ một Postphương thức trên một lớp tĩnh Http.

Vì chúng ta không có thứ gì dễ dàng như vậy, giải pháp tốt nhất tiếp theo là gì?

Làm cách nào để gửi POST HTTP với dữ liệu VÀ nhận nội dung phản hồi?


Điều này thực sự làm việc một cách hoàn hảo đối với tôi ... stickler.de/en/information/code-snippets/...
Jamie Tabone

Câu trả lời:


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);
   }

Bạn sẽ cần những thứ này bao gồm:

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

Nếu bạn khăng khăng sử dụng một phương thức / lớp tĩnh:

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;
    }
}

Sau đó, đơn giản là:

var response = Http.Post("http://dork.com/service", new NameValueCollection() {
    { "home", "Cosby" },
    { "favorite+flavor", "flies" }
});

3
Nếu bạn muốn kiểm soát nhiều hơn các tiêu đề HTTP, bạn có thể thử tương tự bằng cách sử dụng HttpWebRequest và tham chiếu RFC2616 ( w3.org/Prot Protocol / rfc2616 / rfc2616.txt ). Câu trả lời từ jball và BFree theo nỗ lực đó.
Chris Hutchinson

9
Ví dụ này không thực sự đọc câu trả lời, đó là một phần quan trọng của câu hỏi ban đầu!
Jon Watte

4
Để đọc phản hồi, bạn có thể làm string result = System.Text.Encoding.UTF8.GetString(response). Đây là câu hỏi mà tôi tìm thấy câu trả lời.
jporcenaluk

Phương pháp này sẽ không còn hoạt động nếu bạn đang cố gắng xây dựng ứng dụng Windows Store cho Windows 8.1, vì WebClient không được tìm thấy trong System.Net. Thay vào đó, sử dụng câu trả lời của Ramesh và xem xét cách sử dụng "chờ đợi".
Stephen Wylie

2
Tôi sẽ cộng một cái này, nhưng bạn nên đưa vào bình luận @jporcenaluk về việc đọc phản hồi để cải thiện câu trả lời của bạn.
Corgalore

78

Sử dụng HttpClient: liên quan đến phát triển ứng dụng Windows 8, tôi đã tìm thấy điều này.

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)
{


}

6
Cũng hoạt động với Từ điển <Chuỗi, Chuỗi>, làm cho nó sạch hơn.
Peter Hedberg 17/03/13

23
TRẢ LỜI TỐT NHẤT MỌI THỨ .. Oh cảm ơn các lãnh chúa, cảm ơn bạn tôi yêu bạn. Tôi đã đấu tranh .. 2 TUẦN FREAKNG .. bạn sẽ thấy tất cả các bài viết của tôi. ARGHH ITS LÀM VIỆC, YEHAAA <ôm>
Jimmyt1988

1
Lưu ý rằng, khi có thể, bạn không nên sử dụng .Resultvới Asynccác cuộc gọi - sử dụng awaitđể đảm bảo luồng UI của bạn sẽ không bị chặn. Ngoài ra, một đơn giản new[]sẽ làm việc cũng như Danh sách; Từ điển có thể làm sạch mã, nhưng sẽ làm giảm một số chức năng HTTP.
Matt DeKrey

1
Ngày nay (2016) đây là câu trả lời tốt nhất. HttpClient mới hơn WebClient (câu trả lời được bình chọn nhiều nhất) và có một số lợi ích so với nó: 1) Nó có một mô hình lập trình async tốt đang được Henrik F Nielson, người về cơ bản là một trong những người phát minh ra HTTP và ông đã thiết kế API nên nó rất dễ dàng để bạn tuân theo tiêu chuẩn HTTP; 2) Nó được hỗ trợ bởi .Net framework 4.5, do đó, nó có một số mức hỗ trợ được đảm bảo cho tương lai có thể thấy được; 3) Nó cũng có phiên bản xcopyable / Portable-framework của thư viện nếu bạn muốn sử dụng nó trên các nền tảng khác - .Net 4.0, Windows Phone, v.v ...
Luis Gouveia

cách gửi tệp bằng httpclient
Darshan Dave

47

Sử dụng WebRequest . Từ 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();
}

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();
}

12

Cá nhân, tôi nghĩ rằng cách tiếp cận đơn giản nhất để thực hiện một bài đăng http và nhận được phản hồi là sử dụng lớp WebClient. Lớp này trừu tượng độc đáo các chi tiết. Thậm chí còn có một ví dụ mã đầy đủ trong tài liệu MSDN.

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

Trong trường hợp của bạn, bạn muốn phương thức UploadData (). (Một lần nữa, một mẫu mã được bao gồm trong tài liệu)

http://msdn.microsoft.com/en-us/l Library / tbbbwh0a (VS.80) .aspx

UploadString () có thể cũng sẽ hoạt động và nó trừu tượng hóa nó thêm một cấp nữa.

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


+1 Tôi nghi ngờ có rất nhiều cách để làm điều này trong khung.
bóng

7

Tôi biết đây là một chủ đề cũ, nhưng hy vọng nó sẽ giúp một số người.

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);
}

HttpRequest là gì? Nó cho tôi một lỗi "Không tồn tại".
Rahul Khandelwal

6

Đưa ra câu trả lời khác là một vài năm tuổi, hiện tại đây là những suy nghĩ của tôi có thể hữu ích:

Cách đơn giản nhất

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
}

Một ví dụ thực tế hơn

Thông thường chúng tôi đang xử lý các loại và JSON đã biết, vì vậy bạn có thể mở rộng thêm ý tưởng này với bất kỳ số lượng triển khai nào, chẳng hạn như:

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
}

Một ví dụ về cách này có thể được gọi là:

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

5

Bạn có thể sử dụng một cái gì đó như mã giả này:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.