2009-09-24 45 views
15

Tôi đã thấy rất nhiều triển khai gửi một bài đăng http và thừa nhận rằng tôi không hiểu đầy đủ các chi tiết cơ bản để biết những gì cần thiết.Mã POST HTTP chuẩn?

Mã gọn gàng/chính xác/chuẩn tắc để gửi HTTP POST trong C# .NET 3.5 là gì?

Tôi muốn có một phương pháp chung chung như

public string SendPost(string url, string data) 

có thể được bổ sung vào thư viện và luôn luôn được sử dụng để đăng dữ liệu và sẽ trở lại với phản ứng máy chủ.

Trả lời

10

Tôi tin rằng phiên bản đơn giản này sẽ

var client = new WebClient(); 
return client.UploadString(url, data); 

Lớp System.Net.WebClient có phương pháp hữu ích khác cho phép bạn tải về hoặc tải lên chuỗi hoặc một tập tin, hoặc byte.

Rất tiếc, có những trường hợp (khá thường xuyên) mà bạn phải làm nhiều việc hơn. Ví dụ trên không quan tâm đến các tình huống mà bạn cần xác thực đối với máy chủ proxy (mặc dù nó sẽ sử dụng cấu hình proxy mặc định cho IE).

Cũng WebClient không hỗ trợ upload nhiều file hoặc cài đặt (một số cụ thể) tiêu đề và đôi khi bạn sẽ phải đi sâu hơn và sử dụng

System.Web.HttpWebRequestSystem.Net.HttpWebResponse để thay thế.

+0

+1 cho WebClient.UploadString! về những hạn chế của WebClient, có một cách giải quyết dễ dàng, xem câu trả lời của tôi –

+0

Một điều phổ biến mà tôi thấy mình đang làm là đăng xml lên webservice. UploadString có phải là lựa chọn tốt cho kịch bản này không? Còn mã hóa thì sao? có phải là UTF-16 không? – User

+0

bạn có thể đặt Mã hóa thành UFT-16 bằng cách sử dụng thuộc tính Mã hóa của WebClient. –

0

Hãy so sánh:

// create a client object 
using(System.Net.WebClient client = new System.Net.WebClient()) { 
    // performs an HTTP POST 
    client.UploadString(url, xml); 

} 

để

string HttpPost (string uri, string parameters) 
{ 
    // parameters: name1=value1&name2=value2 
    WebRequest webRequest = WebRequest.Create (uri); 
    webRequest.ContentType = "application/x-www-form-urlencoded"; 
    webRequest.Method = "POST"; 
    byte[] bytes = Encoding.ASCII.GetBytes (parameters); 
    Stream os = null; 
    try 
    { // send the Post 
     webRequest.ContentLength = bytes.Length; //Count bytes to send 
     os = webRequest.GetRequestStream(); 
     os.Write (bytes, 0, bytes.Length);   //Send it 
    } 
    catch (WebException ex) 
    { 
     MessageBox.Show (ex.Message, "HttpPost: Request error", 
     MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
    finally 
    { 
     if (os != null) 
     { 
     os.Close(); 
     } 
    } 

    try 
    { // get the response 
     WebResponse webResponse = webRequest.GetResponse(); 
     if (webResponse == null) 
     { return null; } 
     StreamReader sr = new StreamReader (webResponse.GetResponseStream()); 
     return sr.ReadToEnd().Trim(); 
    } 
    catch (WebException ex) 
    { 
     MessageBox.Show (ex.Message, "HttpPost: Response error", 
     MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
    return null; 
} // end HttpPost 

Tại sao mọi người sử dụng/ghi sau này?

+3

Thông thường, vì chúng ta cần phải thực sự sửa đổi yêu cầu vượt quá những gì lớp WebClient cho phép, đặc biệt nếu bạn muốn thay đổi một số tiêu đề WebClient hạn chế khả năng làm như vậy, hãy xem http://msdn.microsoft.com/ en-us/library/system.net.webclient.headers.aspx – RobV

3

Như những người khác đã nói, WebClient.UploadString (hoặc UploadData) là cách để thực hiện.

Tuy nhiên, được xây dựng trong WebClient có một nhược điểm lớn: bạn hầu như không kiểm soát được WebRequest được sử dụng phía sau cảnh (cookie, xác thực, tiêu đề tùy chỉnh ...). Một cách đơn giản để giải quyết vấn đề đó là tạo tùy chỉnh WebClient và ghi đè phương thức GetWebRequest của bạn. Sau đó, bạn có thể tùy chỉnh yêu cầu trước khi được gửi (bạn có thể thực hiện tương tự cho phản hồi bằng cách ghi đè GetWebResponse). Dưới đây là an example của cookie nhận biết WebClient. Rất đơn giản, nó khiến tôi tự hỏi tại sao WebClient tích hợp lại không xử lý nó ra khỏi hộp ...

+0

tuyệt vời, cảm ơn vì liên kết! –

Các vấn đề liên quan