HttpWebRequest का उपयोग करके प्रपत्र डेटा पोस्ट करें


91

मैं एक निर्दिष्ट URL पर कुछ फ़ॉर्म डेटा पोस्ट करना चाहता हूं जो मेरे स्वयं के वेब एप्लिकेशन के अंदर नहीं है। इसका एक ही डोमेन है, जैसे "domain.client.nl"। वेब एप्लिकेशन में एक url है "web.domain.client.nl" en url जहां मैं पोस्ट करना चाहता हूं वह "idp.domain.client.nl" है। लेकिन मेरा कोड कुछ भी नहीं करता है ..... क्या कोई जानता है कि मैं क्या गलत कर रहा हूं?

Wouter

StringBuilder postData = new StringBuilder();
postData.Append(HttpUtility.UrlEncode(String.Format("username={0}&", uname)));
postData.Append(HttpUtility.UrlEncode(String.Format("password={0}&", pword)));
postData.Append(HttpUtility.UrlEncode(String.Format("url_success={0}&", urlSuccess)));
postData.Append(HttpUtility.UrlEncode(String.Format("url_failed={0}", urlFailed)));

ASCIIEncoding ascii = new ASCIIEncoding();
byte[] postBytes = ascii.GetBytes(postData.ToString());

// set up request object
HttpWebRequest request;
try
{
    request = (HttpWebRequest)HttpWebRequest.Create(WebSiteConstants.UrlIdp);
}
catch (UriFormatException)
{
    request = null;
}
if (request == null)
    throw new ApplicationException("Invalid URL: " + WebSiteConstants.UrlIdp);

request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postBytes.Length;
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";

// add post data to request
Stream postStream = request.GetRequestStream();
postStream.Write(postBytes, 0, postBytes.Length);
postStream.Flush();
postStream.Close();

संभावित डुप्लिकेट: stackoverflow.com/questions/5401501/…
डेरियस

6
काफी डुप्लिकेट नहीं है, क्योंकि दूसरा विशेष रूप से उपयोग करना चाहता है WebClient

जवाबों:


72

फ़ील्ड नाम और मान दोनों को url एन्कोडेड होना चाहिए। पोस्ट डेटा और क्वेरी स्ट्रिंग का प्रारूप समान हैं

.Net करने का तरीका कुछ इस तरह है

NameValueCollection outgoingQueryString = HttpUtility.ParseQueryString(String.Empty);
outgoingQueryString.Add("field1","value1");
outgoingQueryString.Add("field2", "value2");
string postdata = outgoingQueryString.ToString();

यह फ़ील्ड और मान नामों को एन्कोडिंग का ध्यान रखेगा


10
string postdata = outgoingQueryString.ToString();आपको मूल्य के साथ एक स्ट्रिंग देगा "System.Collections.Specialized.NameValueCollection"
सूफूका

1
वास्तव में @sfuqua यदि आप HttpUtility (विशेष रूप से System.Web में एक) के लिए स्रोत को अपघटित करते हैं, तो आप देखेंगे कि यह एक विशेष NameValueCollection प्रकार देता है: रिटर्न (NameValueCollection) नया HttpValueCollection (क्वेरी, असत्य, सत्य, एन्कोडिंग); जो संग्रह को क्वेरी स्ट्रिंग में सही रूप से परिवर्तित करता है। यदि आप रेस्टर्शप से एक का उपयोग करते हैं, तो यह नहीं है ...
सीनेटर

दिलचस्प है, जैसा कि मैंने इस सटीक समस्या के साथ देखा था ToString(), हालांकि मुझे अब यह याद नहीं है कि यह रेस्टर्शप का उपयोग करते समय था। निश्चित संभावना। सुधारों के लिए धन्यवाद।
सफूका

यह तुरंत स्पष्ट नहीं outgoingQueryStringथा कि उदाहरण कोड द्वारा कैसे काम किया गया था। ये दो प्रश्न उत्तर देते हैं कि - (1) HttpValueCollection और NameValueCollection और (2) कोई भी .NET क्लास जो क्वेरी स्ट्रिंग दिए गए कुंजी मान जोड़े या पसंद करता है
केनी एविट

57

इसे इस्तेमाल करे:

var request = (HttpWebRequest)WebRequest.Create("http://www.example.com/recepticle.aspx");

var postData = "thing1=hello";
    postData += "&thing2=world";
var data = Encoding.ASCII.GetBytes(postData);

request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;

using (var stream = request.GetRequestStream())
{
    stream.Write(data, 0, data.Length);
}

var response = (HttpWebResponse)request.GetResponse();

var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();

6
मैं बल्कि लिखूंगा: request.Method = WebRequestMethods.Http.Post;
16

पहले उपयोग प्रतिक्रिया request.HaveResponse जाँच
मार्को कल्पना

@MarcoFantasia यदि आप जांचते request.HaveResponseहैं कि आपको वास्तव में पहले प्रतिक्रिया प्राप्त करनी है । HttpWebResponse response = (HttpWebResponse) request.GetResponse(); if (request.HaveResponse) { ... }
हाँ बैरी

41

आप फ़ॉर्म को गलत तरीके से एन्कोडिंग कर रहे हैं। आपको केवल मानों को एनकोड करना चाहिए:

StringBuilder postData = new StringBuilder();
postData.Append("username=" + HttpUtility.UrlEncode(uname) + "&");
postData.Append("password=" + HttpUtility.UrlEncode(pword) + "&");
postData.Append("url_success=" + HttpUtility.UrlEncode(urlSuccess) + "&");
postData.Append("url_failed=" + HttpUtility.UrlEncode(urlFailed));

संपादित करें

मैं गलत था। RFC1866 खंड 8.2.1 के अनुसार नामों और मूल्यों दोनों को एन्कोड किया जाना चाहिए।

लेकिन दिए गए उदाहरण के लिए, नामों में कोई वर्ण नहीं है, जिसे इनकोड करने की आवश्यकता है, इसलिए इस मामले में मेरा कोड उदाहरण सही है;)

प्रश्न में कोड अभी भी गलत है क्योंकि यह समान संकेत को सांकेतिक शब्दों में बदलना होगा, यही कारण है कि वेब सर्वर इसे डिकोड नहीं कर सकता है।

एक और अधिक उचित तरीका होगा:

StringBuilder postData = new StringBuilder();
postData.AppendUrlEncoded("username", uname);
postData.AppendUrlEncoded("password", pword);
postData.AppendUrlEncoded("url_success", urlSuccess);
postData.AppendUrlEncoded("url_failed", urlFailed);

//in an extension class
public static void AppendUrlEncoded(this StringBuilder sb, string name, string value)
{
    if (sb.Length != 0)
        sb.Append("&");
    sb.Append(HttpUtility.UrlEncode(name));
    sb.Append("=");
    sb.Append(HttpUtility.UrlEncode(value));
}

धन्यवाद, लेकिन मुझे निम्नलिखित त्रुटि मिल रही है: दूरस्थ सर्वर ने एक त्रुटि दी: (412) पूर्वधारणा विफल।
wsplinter

मैं बहुत गूगल करता हूं :) लेकिन मैंने इसे ठीक किया, मैं इसे एक गंदे तरीके से कर रहा हूं। मैं एक HttpWebRequest नहीं करता हूं, लेकिन मैं एक स्ट्रिंग के अंदर एक html फॉर्म का निर्माण करता हूं और इसे ब्राउज़र को wirte करता हूं (ऑनलोड में मैं एक सबमिट करूँगा)।
wsplinter

3
@wsplinter: यदि आप पूर्व शर्त के समाधान को विफल करते हैं तो यह दूसरों की मदद करेगा।
jgauffin

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

1
जाहिरा तौर पर, यह मेरे लिए बहुत उम्मीद के मुताबिक काम नहीं कर पाया क्योंकि UrlEncode ने @ जैसे कोड में प्रतीकों को बदल दिया जो एपीआई कॉल में स्वीकार नहीं किए जा रहे थे; NameValueCollection को showin के रूप में @ user3389691 के उत्तर में उपयोग करने के लिए इसे बदलना सही काम करता है।
dhruvpatel
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.