.NET: डेटा के साथ POST भेजने और प्रतिक्रिया पढ़ने का सबसे सरल तरीका


179

मेरे आश्चर्य के लिए, मैं लगभग कुछ भी सरल नहीं कर सकता, जो मैं बता सकता हूं, .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"
);

ऊपर यह काल्पनिक कोड, डेटा के साथ एक HTTP POST बनाता है, और Postएक स्थिर वर्ग पर एक विधि से प्रतिक्रिया देता है Http

चूंकि हम इस आसान के बिना कुछ छोड़ गए हैं, अगला सबसे अच्छा समाधान क्या है?

मैं डेटा के साथ HTTP POST कैसे भेजूं और प्रतिक्रिया की सामग्री प्राप्त करूं?


यह वास्तव में मेरे लिए पूरी तरह से काम किया ... stickler.de/en/information/code-snippets/…
Jamie Tabone

जवाबों:


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

आपको इनकी आवश्यकता होगी:

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

यदि आप एक स्थिर विधि / वर्ग का उपयोग करने पर जोर देते हैं:

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

तो बस:

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

3
यदि आप HTTP हेडर पर अधिक नियंत्रण चाहते हैं, तो आप HttpWebRequest और संदर्भ RFC2616 ( w3.org/Protocols/rfc2616/rfc2616.txt ) का उपयोग करके समान प्रयास कर सकते हैं । उस प्रयास को जॉल और बीफ़्री के उत्तर का अनुसरण करते हैं।
क्रिस हचिंसन

9
यह उदाहरण वास्तव में प्रतिक्रिया को नहीं पढ़ता है, जो मूल प्रश्न का एक महत्वपूर्ण हिस्सा था!
जॉन वाट

4
प्रतिक्रिया पढ़ने के लिए, आप कर सकते हैं string result = System.Text.Encoding.UTF8.GetString(response)यह वह सवाल है जहां मुझे जवाब मिला।
२०:०६ पर jporcenaluk

यदि आप Windows 8.1 के लिए Windows Store ऐप बनाने का प्रयास कर रहे हैं, तो यह विधि काम नहीं करेगी, क्योंकि WebClient System.Net में नहीं मिला है। इसके बजाय, रमेश के जवाब का उपयोग करें और "प्रतीक्षा करें" के उपयोग को देखें।
स्टीफन वायली

2
मैं इसे प्लस-वन करने जा रहा हूं, लेकिन आपको अपने उत्तर को बेहतर बनाने के लिए प्रतिक्रिया पढ़ने के बारे में @jporcenaluk टिप्पणी शामिल करनी चाहिए।
Corgalore

78

HttpClient का उपयोग करना: जहां तक ​​विंडोज 8 ऐप के विकास की चिंताओं का सवाल है, मैं इस पर आया हूं।

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
इसके अलावा एक शब्दकोश <स्ट्रिंग, स्ट्रिंग> के साथ काम करता है, जो इसे क्लीनर बनाता है।
पीटर हडबर्ग

23
BEST जवाब कभी .. ओह, शुक्रिया लॉर्ड्स, धन्यवाद मैं तुम्हें प्यार करता हूँ। मैं संघर्ष कर रहा हूं .. 2 FREAKNG WEEKS .. आपको मेरी सभी पोस्ट देखनी चाहिए। ARGHH ITS काम कर रहा है, YEHAAA <hugs>
Jimmyt1988

1
ध्यान दें कि जब संभव हो, आप उपयोग नहीं करना चाहिए .Resultके साथ Asyncकॉल - उपयोग awaitसुनिश्चित करने के लिए अपने यूआई धागा बंद नहीं होंगे। इसके अलावा, एक सरल new[]और साथ ही सूची काम करेगी; शब्दकोश कोड को साफ कर सकता है, लेकिन कुछ HTTP कार्यक्षमता को कम करेगा।
मैट डेके

1
आजकल (2016) यह सबसे अच्छा जवाब है। HttpClient WebClient (सबसे अधिक वोट किए गए उत्तर) की तुलना में नया है और इस पर कुछ लाभ हैं: 1) इसमें हेनरिक एफ नील्सन द्वारा काम किया जा रहा एक अच्छा async प्रोग्रामिंग मॉडल है जो मूल रूप से HTTP के अन्वेषकों में से एक है, और उन्होंने एपीआई को डिजाइन किया है। आपके लिए HTTP मानक का पालन करना आसान है; 2) यह .Net फ्रेमवर्क 4.5 द्वारा समर्थित है, इसलिए इसमें निकट भविष्य के लिए समर्थन की गारंटी स्तर है; 3) यदि आपके पास इसे अन्य प्लेटफार्मों पर उपयोग करना चाहते हैं - तो। नेट 4.0, विंडोज फोन आदि ...
लुइस गॉविया

httpclient के साथ फाइल कैसे भेजें
दर्शन डेव

47

WebRequest का उपयोग करें । से स्कॉट 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

व्यक्तिगत रूप से, मुझे लगता है कि http पोस्ट करने के लिए सबसे सरल दृष्टिकोण और प्रतिक्रिया प्राप्त करना WebClient वर्ग का उपयोग करना है। यह वर्ग अच्छी तरह से विवरण को सार करता है। MSDN प्रलेखन में एक पूर्ण कोड उदाहरण भी है।

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

आपके मामले में, आप UploadData () विधि चाहते हैं। (फिर, एक कोड नमूना प्रलेखन में शामिल किया गया है)

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

UploadString () संभवतः भी काम करेगा, और यह इसे एक और स्तर से दूर करता है।

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


+1 मुझे संदेह है कि फ्रेमवर्क में ऐसा करने के तरीकों का एक समूह है।
15

7

मुझे पता है कि यह एक पुराना धागा है, लेकिन आशा है कि यह किसी एक की मदद करेगा।

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 क्या है? इसका मुझे एक त्रुटि देना "अस्तित्व में नहीं है"।
राहुल खंडेलवाल

6

अन्य उत्तरों को देखते हुए कुछ साल पुराने हैं, वर्तमान में यहाँ मेरे विचार हैं जो सहायक हो सकते हैं:

सबसे सरल तरीका

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
}

एक अधिक व्यावहारिक उदाहरण

अक्सर हम ज्ञात प्रकार और JSON के साथ काम कर रहे हैं, इसलिए आप इस विचार को किसी भी संख्या में कार्यान्वयन के साथ आगे बढ़ा सकते हैं, जैसे:

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
}

यह कैसे कहा जा सकता है इसका एक उदाहरण:

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

5

आप इस छद्म कोड की तरह कुछ का उपयोग कर सकते हैं:

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