HTTPWebRequest ব্যবহার করে ফর্ম ডেটা পোস্ট করুন


91

আমি একটি নির্দিষ্ট ইউআরএলে কিছু ফর্ম ডেটা পোস্ট করতে চাই যা আমার নিজের ওয়েব অ্যাপ্লিকেশনের ভিতরে নেই। এটির "ডোমেন.ক্লিয়েন্ট.এনএল" এর মতো একই ডোমেন রয়েছে। ওয়েব অ্যাপ্লিকেশনটির একটি url "web.domain.client.nl" রয়েছে যেখানে আমি url এ পোস্ট করতে চাই "idp.domain.client.nl"। তবে আমার কোডটি কিছু করে না ..... কেউ কি জানে আমি কী ভুল করছি?

ওয়াটার

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


6
অন্যটি বিশেষত ব্যবহার করতে চায় বলে একেবারে সদৃশ নয় WebClient

উত্তর:


72

ক্ষেত্রের নাম এবং মান উভয়ই url এনকোড করা উচিত। পোস্ট ডেটা ফর্ম্যাট এবং কোয়েরি স্ট্রিং একই

। নেট উপায়টি এরকম কিছু

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"
sfuqua

4
প্রকৃতপক্ষে @sfuqua যদি আপনি এইচটিটিপিটিলিটির জন্য উত্সটি বিভক্ত করেন (বিশেষত এটি সিস্টেমের মধ্যে একটি) ওয়েবে আপনি দেখতে পাবেন যে এটি একটি বিশেষ নামভ্যালিউ কালেকশন প্রকার ফেরত পাঠাবে: যা সংগ্রহকে সঠিকভাবে একটি ক্যোয়ারী স্ট্রিংয়ে রূপান্তর করে। তবে আপনি যদি রেস্টশর্প থেকে এটি ব্যবহার করেন তবে তা হয় না ...
সিনেটর

আকর্ষণীয়, আমি যেমনটি দেখতে পেয়েছিলাম ঠিক তেমন সমস্যাটি ToString(), যদিও আমি এখন মনে করতে পারি না যে এটি রেস্টশার্প ব্যবহারের সময় ছিল কিনা। অনন্ত সম্ভাবনা। সংশোধনীর জন্য ধন্যবাদ.
sfuqua

outgoingQueryStringউদাহরণস্বরূপ কোড দ্বারা বোঝানো কীভাবে কাজ করা হয়েছিল তা অবিলম্বে পরিষ্কার ছিল না । এই দুটি প্রশ্নের উত্তর দেয় যে - (১) এইচটিপিভিউলিউ কালেকশন এবং নেমভ্যালু কালেকশন এবং (২) কোনও। নেট ক্লাস যা কোনও প্রশ্নের স্ট্রিং তৈরি করে মূল মান জোড়া বা এর মতো করে
কেনে এভিট

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
আমি বরং লিখতে চাই: অনুরোধ.Method = WebRequestMethods.Http.Post;
টোটিলি

অনুরোধ পরীক্ষা করুন। ব্যবহারের প্রতিক্রিয়া দেওয়ার আগে
মার্কো ফ্যান্টাসিয়া

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

সম্পাদনা করুন

আমি ভুল ছিল। আরএফসি 1866 বিভাগ অনুযায়ী 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

আমি অনেক গুগল করেছি :) তবে আমি এটি স্থির করেছি, আমি এটি নির্লজ্জভাবে করছি। আমি কোনও এইচটিপিওয়েবরেউয়েস্ট করি না তবে আমি একটি স্ট্রিংয়ের ভিতরে এইচটিএমএল ফর্ম তৈরি করি এবং এটি ব্রাউজারে ওয়্যার্ট করি (অনলোডে আমি একটি জমা দেব)।
wsplinter

4
@wsplinter: আপনি পূর্ব শর্তটির সমাধান ব্যর্থ করে অন্যকে সহায়তা করবে।
jgauffin

@ জাগাফিন: আমি কীভাবে রেডিও বোতামের মান পোস্ট করব? ধরুন আমার কাছে একই গ্রুপের 3 টি রেডিও বোতাম রয়েছে।
আসাদ রেফাই

4
স্পষ্টতই, এটি আমার পক্ষে প্রত্যাশিতভাবে বেশ কার্যকরভাবে কাজ করে নি, যেহেতু ইউরাল এনকোড @ জাতীয় কোডগুলিতে এপিআই কলটিতে স্বীকৃত ছিল না এমন @ কোডগুলিতে পরিবর্তন করে; @ ব্যবহারকারী 3389691 এর উত্তরে শোভন হিসাবে নেমভ্যালিউ কালেকশনটি ব্যবহার করতে এটি পরিবর্তন করা নিখুঁত কাজ করে।
ধ্রুবপেটেল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.