Cách đăng dữ liệu lên URL cụ thể bằng WebClient trong C #


319

Tôi cần sử dụng "Bài đăng HTTP" với WebClient để đăng một số dữ liệu lên một URL cụ thể mà tôi có.

Bây giờ, tôi biết điều này có thể được thực hiện với WebRequest nhưng vì một số lý do tôi muốn sử dụng WebClient thay thế. Điều đó có thể không? Nếu vậy, ai đó có thể chỉ cho tôi một số ví dụ hoặc chỉ cho tôi đi đúng hướng?

Câu trả lời:


374

Tôi chỉ tìm thấy giải pháp và yea ​​nó dễ hơn tôi nghĩ :)

Vì vậy, đây là giải pháp:

string URI = "http://www.myurl.com/post.php";
string myParameters = "param1=value1&param2=value2&param3=value3";

using (WebClient wc = new WebClient())
{
    wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
    string HtmlResult = wc.UploadString(URI, myParameters);
}

nó hoạt động như sự quyến rũ :)


28
Một nitpick: tốt hơn là sử dụng HttpRequestHeader.ContentTypethành viên liệt kê ở đây như thế này web.Headers[HttpRequestHeader.ContentType]: p
Alex

12
Một nitlog khác, bạn nên loại bỏ webclient đúng cách bằng cách sử dụng .dispose hoặc thành ngữ "bằng cách sử dụng": bằng cách sử dụng (WebClient wc = new WebClient ()) {// mã của bạn tại đây}
Mikey Hogarth

1
@RobinVanPersi Tôi nghĩ ShikataGanai (Rafik bari) có nghĩa là câu trả lời khác ( stackoverflow.com/a/13061805/1160796 ) tốt hơn vì nó xử lý mã hóa cho bạn.
basher

3
@ alpsystems.com Các đối tượng có thể sử dụng được cần phải được lập trình viên xử lý đúng cách, bằng cách gói trong khi sử dụng hoặc bằng cách gọi rõ ràng .Dispose (). Trình thu gom rác không thể theo dõi các tài nguyên không được quản lý, như trình xử lý tệp, kết nối cơ sở dữ liệu, v.v.
ccalboni

1
Để mở rộng giải thích @ ccalboni's. Trong một số trường hợp, trình thu gom rác sẽ dọn sạch các tài nguyên không được quản lý và tương tự bằng cách gọi hàm hủy (ví dụ: WebClientkế thừa từ Component, có chứa ~Component() {Dispose(false);}). Vấn đề là người thu gom rác có thể mất nhiều thời gian để làm như vậy, vì nó không tính đến các tài nguyên không được quản lý khi đưa ra quyết định thu gom. Tài nguyên có giá trị cao phải được dọn sạch càng sớm càng tốt. Ví dụ, để mở một xử lý tệp không cần thiết có thể chặn tệp bị xóa hoặc ghi vào mã khác.
Brian

361

Có một phương thức được xây dựng có tên là UploadValues có thể gửi HTTP POST (hoặc bất kỳ loại phương thức HTTP nào) VÀ xử lý việc xây dựng phần thân yêu cầu (nối các tham số với "&" và thoát các ký tự bằng mã hóa url) ở định dạng dữ liệu dạng phù hợp:

using(WebClient client = new WebClient())
{
    var reqparm = new System.Collections.Specialized.NameValueCollection();
    reqparm.Add("param1", "<any> kinds & of = ? strings");
    reqparm.Add("param2", "escaping is already handled");
    byte[] responsebytes = client.UploadValues("http://localhost", "POST", reqparm);
    string responsebody = Encoding.UTF8.GetString(responsebytes);
}

1
Nếu tôi muốn đăng một mô hình lên bộ điều khiển thì sao? Tôi vẫn có thể sử dụng reqparm.Add (chuỗi, chuỗi) chứ?
Burak Karakuş

6
@ BurakKarakuş có nghĩa là bạn muốn gửi JSON trong cơ thể? Sau đó, bạn có thể muốn sử dụng WebClient.UploadString . Đừng quên thêm Kiểu nội dung: application / json trong tiêu đề.
Endy Tjahjono

@EndyTjahjono: Làm cách nào tôi có thể đăng các giá trị nút radio. Giả sử tôi có 3 nút radio thuộc cùng một nhóm.
Asad Refai

Làm thế nào để tôi có được mã phản hồi? Phản hồi tiêu đề? Tôi có phải phân tích cú pháp trả lời không? Có một cách dễ dàng để làm điều đó?
Jay Sullivan

CẢNH BÁO . namevalueCollection donest cho phép cùng khóa .thus có thể dẫn đến ăn xin kỳ lạ
bh_earth0

40

Sử dụng WebClient.UploadStringhoặc WebClient.UploadDatabạn có thể POST dữ liệu lên máy chủ một cách dễ dàng. Tôi sẽ hiển thị một ví dụ bằng UploadData, vì UploadString được sử dụng theo cách tương tự như DownloadString.

byte[] bret = client.UploadData("http://www.website.com/post.php", "POST",
                System.Text.Encoding.ASCII.GetBytes("field1=value1&amp;field2=value2") );

            string sret = System.Text.Encoding.ASCII.GetString(bret);

thêm: http://www.daveamenta.com/2008-05/c-webclient-usage/


5
tốt hơn để sử dụng: client.Encoding = System.Text.UTF8Encoding.UTF8; chuỗi varValue = Uri.EscapeDataString (giá trị);
Yuriy Vikulov

23
string URI = "site.com/mail.php";
using (WebClient client = new WebClient())
{
    System.Collections.Specialized.NameValueCollection postData = 
        new System.Collections.Specialized.NameValueCollection()
       {
              { "to", emailTo },  
              { "subject", currentSubject },
              { "body", currentBody }
       };
    string pagesource = Encoding.UTF8.GetString(client.UploadValues(URI, postData));
}

21
//Making a POST request using WebClient.
Function()
{    
  WebClient wc = new WebClient();

  var URI = new Uri("http://your_uri_goes_here");

  //If any encoding is needed.
  wc.Headers["Content-Type"] = "application/x-www-form-urlencoded";
  //Or any other encoding type.

  //If any key needed

  wc.Headers["KEY"] = "Your_Key_Goes_Here";

  wc.UploadStringCompleted += 
      new UploadStringCompletedEventHandler(wc_UploadStringCompleted);

  wc.UploadStringAsync(URI,"POST","Data_To_Be_sent");    
}

void wc__UploadStringCompleted(object sender, UploadStringCompletedEventArgs e)    
{  
  try            
  {          
     MessageBox.Show(e.Result); 
     //e.result fetches you the response against your POST request.         
  }
  catch(Exception exc)         
  {             
     MessageBox.Show(exc.ToString());            
  }
}

Sử dụng phiên bản async là một điều tốt, tất cả những điều trên đều được đăng và chặn thực thi.
Juan

xóa gấp đôi __ để sửa wc__UploadStringCompleted
Joel Davis

1
Tất cả các câu trả lời trên sẽ hoạt động tốt trong thử nghiệm, nhưng trong tình huống thực tế với internet kém thì đây là một câu trả lời tốt hơn.
Joel Davis

2

Sử dụng đơn giản client.UploadString(adress, content);thường hoạt động tốt nhưng tôi nghĩ nên nhớ rằng WebExceptionsẽ bị ném nếu không trả lại mã trạng thái thành công HTTP. Tôi thường xử lý nó như thế này để in bất kỳ thông báo ngoại lệ nào mà máy chủ từ xa đang trả về:

try
{
    postResult = client.UploadString(address, content);
}
catch (WebException ex)
{
    String responseFromServer = ex.Message.ToString() + " ";
    if (ex.Response != null)
    {
        using (WebResponse response = ex.Response)
        {
            Stream dataRs = response.GetResponseStream();
            using (StreamReader reader = new StreamReader(dataRs))
            {
                responseFromServer += reader.ReadToEnd();
                _log.Error("Server Response: " + responseFromServer);
            }
        }
    }
    throw;
}

cảm ơn bạn, Ogglas. Tôi đã dành rất nhiều thời gian để tìm lỗi và mã của bạn cung cấp cho tôi thêm thông tin để khắc phục.
Kate

1

Sử dụng webapiclient với mô hình gửi yêu cầu tham số json nối tiếp.

PostModel.cs

    public string Id { get; set; }
    public string Name { get; set; }
    public string Surname { get; set; }
    public int Age { get; set; }

WebApiClient.cs

internal class WebApiClient  : IDisposable
  {

    private bool _isDispose;

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    public void Dispose(bool disposing)
    {
        if (!_isDispose)
        {

            if (disposing)
            {

            }
        }

        _isDispose = true;
    }

    private void SetHeaderParameters(WebClient client)
    {
        client.Headers.Clear();
        client.Headers.Add("Content-Type", "application/json");
        client.Encoding = Encoding.UTF8;
    }

    public async Task<T> PostJsonWithModelAsync<T>(string address, string data,)
    {
        using (var client = new WebClient())
        {
            SetHeaderParameters(client);
            string result = await client.UploadStringTaskAsync(address, data); //  method:
    //The HTTP method used to send the file to the resource. If null, the default is  POST 
            return JsonConvert.DeserializeObject<T>(result);
        }
    }
}

Phương thức gọi doanh nghiệp

    public async Task<ResultDTO> GetResultAsync(PostModel model)
    {
        try
        {
            using (var client = new WebApiClient())
            {
                var serializeModel= JsonConvert.SerializeObject(model);// using Newtonsoft.Json;
                var response = await client.PostJsonWithModelAsync<ResultDTO>("http://www.website.com/api/create", serializeModel);
                return response;
            }
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }

    }

0

Đây là câu trả lời rõ ràng:

public String sendSMS(String phone, String token) {
    WebClient webClient = WebClient.create(smsServiceUrl);

    SMSRequest smsRequest = new SMSRequest();
    smsRequest.setMessage(token);
    smsRequest.setPhoneNo(phone);
    smsRequest.setTokenId(smsServiceTokenId);

    Mono<String> response = webClient.post()
          .uri(smsServiceEndpoint)
          .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
          .body(Mono.just(smsRequest), SMSRequest.class)
          .retrieve().bodyToMono(String.class);

    String deliveryResponse = response.block();
    if (deliveryResponse.equalsIgnoreCase("success")) {
      return deliveryResponse;
    }
    return null;
}
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.