[c#] HttpWebRequest를 사용하여 양식 데이터 게시

내 웹 응용 프로그램에없는 지정된 URL에 일부 양식 데이터를 게시하고 싶습니다. “domain.client.nl”과 같은 동일한 도메인이 있습니다. 웹 응용 프로그램에는 “web.domain.client.nl”이라는 URL이 있으며 게시 할 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();



답변

필드 이름과 값은 모두 URL로 인코딩되어야합니다. 게시물 데이터의 형식과 쿼리 문자열이 동일합니다.

.net 방식은 다음과 같습니다.

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

이것은 필드와 값 이름의 인코딩을 처리합니다.


답변

이 시도:

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


답변

양식을 잘못 인코딩하고 있습니다. 다음 값만 인코딩해야합니다.

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


답변