Đăng dữ liệu biểu mẫu bằng cách sử dụng HttpWebRequest


77
19
Võ Phụng Việt
7 năm trước

Tôi muốn đăng một số dữ liệu biểu mẫu lên một URL được chỉ định không có trong ứng dụng web của riêng tôi. Nó có cùng tên miền, chẳng hạn như "domain.client.nl". Ứng dụng web có url "web.domain.client.nl" vi url mà tôi muốn đăng lên là "idp.domain.client.nl". Nhưng mã của tôi không làm gì cả ..... có ai biết tôi đang làm gì sai không?

Đồ trang sức

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();
Hữu ích 77 Yêu thích 19 Chia sẻ Viết bình luận 2
Không hữu ích

Không hoàn toàn trùng lặp, như người khác đặc biệt muốn sử dụng WebClient.

Hữu ích 4 · Không hữu ích · Trả lời 0
Hữu ích 0 · Không hữu ích · Trả lời 0

3 Trả lời


67
Hoàng Thanh Ðoàn
6 năm trước

Cả tên trường và giá trị phải được mã hóa url. định dạng của dữ liệu bài đăng và chuỗi truy vấn giống nhau

Cách làm .net là như thế này

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

Điều này sẽ đảm nhiệm việc mã hóa các trường và tên giá trị

Hữu ích 67 Chia sẻ Viết bình luận 4
Không hữu ích

string postdata = outgoingQueryString.ToString();sẽ cung cấp cho bạn một chuỗi với giá trị "System.Collections.Specialized.NameValueCollection".

Hữu ích 9 · Không hữu ích · Trả lời 0

Trên thực tế @sfuqua nếu bạn dịch ngược nguồn cho HttpUtility (cụ thể là nguồn trong System.Web) bạn sẽ thấy rằng nó trả về một loại NameValueCollection chuyên dụng: return (NameValueCollection) mới httpValueCollection (truy vấn, sai, đúng, mã hóa); mà chuyển đổi chính xác bộ sưu tập thành một chuỗi truy vấn. Tuy nhiên, nếu bạn sử dụng một từ RestSharp, thì nó không ...

Hữu ích 1 · Không hữu ích · Trả lời 0

Thật thú vị, như tôi đã thấy vấn đề chính xác này ToString(), mặc dù bây giờ tôi không thể nhớ nếu đó là trong khi sử dụng RestSharp. Khả năng xác định. Cảm ơn vì sự đúng đắn của bạn.

Hữu ích 0 · Không hữu ích · Trả lời 0

Không rõ ngay cách thức hoạt outgoingQueryStringđộng như được ngụ ý bởi mã ví dụ. Hai câu hỏi này trả lời rằng - (1) HttpValueCollection và NameValueCollection và (2) Bất kỳ lớp .NET nào tạo ra một chuỗi truy vấn được cung cấp các cặp giá trị khóa hoặc tương tự .

Hữu ích 0 · Không hữu ích · Trả lời 0

44
Nguyễn Hiếu Dụng
5 năm trước

Thử đi:

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();
Hữu ích 44 Chia sẻ Viết bình luận 4
Không hữu ích

Tôi thà viết: request.Method = WebRequestMethods.Http.Post;

Hữu ích 4 · Không hữu ích · Trả lời 0

Làm việc như quyến rũ, cảm ơn :)

Hữu ích 2 · Không hữu ích · Trả lời 0

kiểm tra yêu cầu.HaveResponse trước khi sử dụng phản hồi

Hữu ích 0 · Không hữu ích · Trả lời 0

Cảm ơn bạn đời! Điều đó đã giải quyết vấn đề của tôi.

Hữu ích 0 · Không hữu ích · Trả lời 0

37
Võ Thiên Thảo
7 năm trước

Bạn đang mã hóa biểu mẫu không chính xác. Bạn chỉ nên mã hóa các giá trị:

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

chỉnh sửa

Tôi đã không chính xác. Theo RFC1866, phần 8.2.1, cả tên và giá trị phải được mã hóa.

Nhưng đối với ví dụ đã cho, các tên không có bất kỳ ký tự nào cần được mã hóa, vì vậy trong trường hợp này, ví dụ mã của tôi là chính xác;)

Mã trong câu hỏi vẫn không chính xác vì nó sẽ mã hóa dấu bằng là lý do tại sao máy chủ web không thể giải mã nó.

Một cách thích hợp hơn sẽ là:

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));
}
Hữu ích 37 Chia sẻ Viết bình luận 5
Không hữu ích

@wsplinter: Nó sẽ giúp người khác nếu bạn ghi lại giải pháp cho điều kiện tiên quyết không thành công.

Hữu ích 2 · Không hữu ích · Trả lời 0

Rõ ràng, điều này không hoạt động với tôi như mong đợi vì UrlEncode thay đổi các ký hiệu như @ thành mã không được chấp nhận trong lệnh gọi API; thay đổi nó để sử dụng NameValueCollection như showin trong câu trả lời của @ user3389691 hoạt động hoàn hảo.

Hữu ích 1 · Không hữu ích · Trả lời 0

Cảm ơn, butnow Tôi nhận được lỗi sau: Máy chủ từ xa đã trả về lỗi: (412) Điều kiện tiên quyết không thành công.

Hữu ích 0 · Không hữu ích · Trả lời 0

bạn đã google nó chưa?

Hữu ích 0 · Không hữu ích · Trả lời 0

Tôi google rất nhiều :) Nhưng tôi đã sửa nó, tôi đang làm nó một cách bẩn thỉu. Tôi không phải là một httpWebRequest nhưng tôi xây dựng một biểu mẫu html bên trong Chuỗi và đưa nó lên trình duyệt (trong phần tải, tôi sẽ gửi).

Hữu ích 0 · Không hữu ích · Trả lời 0

Trả lời của bạn

Xem trước nội dung