Pertanyaan Posting data formulir menggunakan HttpWebRequest


Saya ingin memposting beberapa data formulir ke URL yang ditentukan yang tidak ada di dalam aplikasi web saya sendiri. Ini memiliki domain yang sama, seperti "domain.client.nl". Aplikasi web memiliki url "web.domain.client.nl" en url di mana saya ingin memposting ke adalah "idp.domain.client.nl". Tapi kode saya tidak melakukan apa-apa ..... apakah seseorang tahu apa yang saya lakukan salah?

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

75
2018-02-05 08:18


asal


Jawaban:


Nama kolom dan nilai harus dikodekan url. format data pos dan string kueri adalah sama

Cara bersih .net adalah sesuatu seperti ini

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

Ini akan menangani pengkodean field dan nama nilai


66
2018-03-06 19:48



Anda mengkodekan formulir dengan tidak benar. Anda hanya harus menyandikan nilai-nilai:

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

sunting 

Saya salah. Menurut RFC1866 bagian 8.2.1 nama dan nilai harus dikodekan.

Tapi untuk contoh yang diberikan, nama-nama tidak memiliki karakter yang perlu dikodekan, jadi dalam hal ini contoh kode saya benar;)

Kode dalam pertanyaan masih salah karena akan menyandikan tanda sama yang merupakan alasan mengapa server web tidak dapat mendekodekannya.

Cara yang lebih tepat adalah:

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

36
2018-02-05 08:27



Coba ini:

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

36
2018-04-14 03:55