C # में WebClient का उपयोग करके विशिष्ट URL पर डेटा कैसे पोस्ट करें


319

मेरे पास एक विशिष्ट URL के लिए कुछ डेटा पोस्ट करने के लिए WebClient के साथ "HTTP पोस्ट" का उपयोग करने की आवश्यकता है।

अब, मुझे पता है कि यह WebRequest के साथ पूरा किया जा सकता है लेकिन कुछ कारणों से मैं इसके बजाय WebClient का उपयोग करना चाहता हूं। क्या यह संभव है? यदि हां, तो क्या कोई मुझे कुछ उदाहरण दिखा सकता है या मुझे सही दिशा की ओर इशारा कर सकता है?

जवाबों:


374

मैं सिर्फ समाधान पाया और हाँ, जितना मैंने सोचा था कि यह आसान था :)

तो यहाँ समाधान है:

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

यह आकर्षण की तरह काम करता है :)


28
ए नाइटपिक: HttpRequestHeader.ContentTypeएन्यूमरेशन मेंबर का इस तरह से उपयोग करना बेहतर है web.Headers[HttpRequestHeader.ContentType]: पी
एलेक्स

12
एक और नाइटपिक, आपको ठीक से उपयोग करने वाले वेबक्लाइंट का निपटान करना चाहिए। डाइसॉर्प या "मुहावरे का उपयोग करना": (WebClient wc = new WebClient ()) {// आपका कोड यहाँ} का उपयोग करना
मिकी होगर

1
@RobinVanPersi मुझे लगता है कि ShikataGanai (रफ़ीक बारी) का मतलब था कि अन्य उत्तर ( stackoverflow.com/a/13061805/1160796 ) बेहतर है क्योंकि यह आपके लिए एन्कोडिंग को संभालता है।
बशीर

3
@ alpsystems.com पहचान योग्य वस्तुओं को प्रोग्रामर द्वारा ठीक से निपटाया जाना चाहिए, या तो उपयोग करके या स्पष्ट रूप से लागू करके। कचरा संग्रहकर्ता अप्रबंधित संसाधनों को ट्रैक नहीं कर सकता, जैसे फ़ाइल हैंडलर, डेटाबेस कनेक्शन और इतने पर
ccalboni

1
@ Ccalboni के स्पष्टीकरण का विस्तार करने के लिए। कुछ मामलों में कचरा संग्राहक अप्रबंधित संसाधनों को साफ कर देगा और जैसे विध्वंसक को कॉल करके (जैसे , जिसमें WebClientसे विरासत Componentमें मिला है ~Component() {Dispose(false);})। समस्या यह है कि कचरा संग्रहकर्ता को ऐसा करने में एक मनमाने ढंग से लंबा समय लग सकता है, क्योंकि यह संग्रह निर्णय लेते समय अप्रबंधित संसाधनों के लिए जिम्मेदार नहीं है। उच्च-मूल्य के संसाधनों को जल्द से जल्द साफ किया जाना चाहिए। उदाहरण के लिए, एक अनावश्यक फ़ाइल हैंडल को खुला छोड़ने से फ़ाइल को हटा दिया जा सकता है या अन्य कोड द्वारा लिखा जा सकता है।
ब्रायन

361

अंतर्निहित विधि है जिसे अपलोडवैल्यूज़ कहा जाता है जो HTTP POST (या किसी भी तरह के HTTP तरीके) भेज सकता है और उचित प्रपत्र डेटा प्रारूप में अनुरोध निकाय ("और" के साथ मापदंडों को बदलना और url एन्कोडिंग द्वारा वर्णों से बचना) का निर्माण संभालता है:

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
क्या होगा यदि मैं नियंत्रक के लिए एक मॉडल पोस्ट करना चाहता हूं? क्या मैं अभी भी reqparm.Add (स्ट्रिंग, स्ट्रिंग) का उपयोग कर सकता हूं?
बुरक करकुस

6
@ BurakKarakuş क्या आप शरीर में JSON भेजना चाहते हैं? तब आप WebClient.UploadString का उपयोग करना चाह सकते हैं । हेडर में कंटेंट-टाइप: एप्लिकेशन / जसन जोड़ना न भूलें।
एंडी तजहोनो

@EndyTjahjono: मैं रेडियो बटन मूल्यों को कैसे पोस्ट कर सकता हूं। मान लें कि मेरे पास 3 रेडियो बटन एक ही समूह के हैं।
असद रिफाई

मुझे प्रतिक्रिया कोड कैसे मिलेगा? रिस्पांस हेडर? क्या मुझे प्रतिक्रिया को पार्स करना है? क्या ऐसा करने का एक आसान तरीका है?
जे सुलीवन 19

WARNİNG। namevalueCollection donest एक ही कुंजी की अनुमति देते हैं। यह अजीबोगरीब का नेतृत्व कर सकता है
bh_earth0

40

का उपयोग करके WebClient.UploadStringया WebClient.UploadDataआप आसानी से सर्वर पर डेटा पोस्ट कर सकते हैं। मैं UploadData का उपयोग करके एक उदाहरण दिखाऊंगा, क्योंकि UploadString का उपयोग उसी तरह किया जाता है जैसे कि 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);

और अधिक: http://www.daveamenta.com/2008-05/c-webclient-usage/


5
का उपयोग करने के लिए बेहतर: ग्राहक। Encoding = System.Text.UTF8Encoding.UTF8; string varValue = Uri.EscapeDataString (मान);
यूरी विकुलोव

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

Async संस्करण का उपयोग करना एक अच्छा है जो उपरोक्त सभी पोस्ट कर रहे हैं और निष्पादन को रोक रहे हैं।
जुआन

हटाने के लिए डबल __ को wc__UploadStringCompleted
जोएल डेविस

1
उपरोक्त सभी उत्तर परीक्षण में ठीक काम करेंगे, लेकिन खराब इंटरनेट के साथ वास्तविक जीवन की स्थिति में यह एक बेहतर उत्तर है।
जोएल डेविस

2

client.UploadString(adress, content);सामान्य रूप से उपयोग करना सामान्य रूप से ठीक काम करता है, लेकिन मुझे लगता है कि यह याद रखना चाहिए कि WebExceptionयदि HTTP सफल स्थिति कोड नहीं लौटाया जाता है तो उसे फेंक दिया जाएगा। मैं आमतौर पर इसे किसी भी अपवाद संदेश को प्रिंट करने के लिए इस तरह से संभालता हूं रिमोट सर्वर वापस आ रहा है:

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

धन्यवाद, ओग्लास। मैंने त्रुटि खोजने के लिए बहुत समय बिताया और आपका कोड मुझे ठीक करने के लिए अधिक जानकारी देता है।
केट

1

मॉडल के साथ webapiclient का उपयोग करके क्रमबद्ध जोंस पैरामीटर अनुरोध भेजें।

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

व्यापार कॉलर विधि

    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

यहाँ कुरकुरा जवाब है:

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;
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.