2011-10-09 21 views
6

Tôi phải tích hợp với API của bên thứ ba. Để sử dụng dịch vụ, tôi phải "POST" tới một url cụ thể với các thông số nhất định.Cách tương đương để đặt tham số bài trong .net là gì?

Đoạn mã ví dụ được cung cấp bởi các dịch vụ là trong php và thực hiện như sau

$data = array('From' => '0999999', 'To' => '08888888'); 
$curl = curl_init(); 
curl_setopt($curl, CURLOPT_FAILONERROR, true); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER,true); 
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); <--- Ignore SSL warnings 
curl_setopt($curl, CURLOPT_POST, true); 
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); 

Tôi cố gắng để sử dụng lớp WebRequest để đạt được cùng trong .net. Tuy nhiên, tôi hơi bối rối về cách đặt dữ liệu tham số bài đăng. Tôi đã tìm thấy $ data ở trên không là gì ngoài một từ điển. Vì vậy, tôi đã tạo một từ điển tương đương. Tuy nhiên, làm cách nào để đặt thông số bài đăng bằng các giá trị từ điển?

Trong http://msdn.microsoft.com/en-us/library/debx8sh9.aspx, chúng đã tuần tự hóa chuỗi thành một mảng byte và sau đó đặt làm tham số bài đăng trong luồng dữ liệu. Làm thế nào để tôi làm tương tự cho một từ điển?

Hoặc phương pháp tiếp cận của tôi có đúng không? Có cách nào tốt hơn để làm điều này?

Trả lời

8

Nói chung, WebClient.UploadValues sẽ là phương pháp đơn giản nhất ở đây; see MSDN for a full example. Tuy nhiên, lưu ý rằng điều này chỉ bao gồm CURLOPT_POSTFIELDSCURLOPT_POST. Lỗi không thành công là tự động và ngầm định và phản hồi đã được bao gồm dưới dạng byte[].

ví dụ:

using(var client = new WebClient()) { 
    var data = new NameValueCollection(); 
    data.Add("From", "0999999"); 
    data.Add("To", "08888888"); 
    var result = client.UploadValues(url, data); 
} 

lưu ý POST là tiềm ẩn ở đây; nếu bạn cần một phương pháp http khác nhau, sử dụng quá tải:

var result = client.UploadValues(url, "PUT", data); // for example 
+0

Có tương đương với CURLOPT_SSL_VERIFYPEER sao cho tôi có thể bỏ qua bất kỳ ngoại lệ SSL nào không? Chứng chỉ từ xa là chứng chỉ SSL tự tạo và các nhà phát triển Api của bên thứ ba muốn người khác bỏ qua bất kỳ cảnh báo SSL nào. Hoặc là cách tiếp cận được hiển thị tại http://www.ben-morris.com/asp-net-web-services-and-ssl-certificates-establishing-a-trust-relationship cách dễ nhất? Đây có phải là một câu hỏi riêng biệt không? – shashi

+1

@sassyboy lại SSL, xem http://stackoverflow.com/questions/109186/bypass-invalid-ssl-certificate-errors-when-calling-web-services-in-net/865786#865786 –

+0

Cảm ơn bạn. Điều đó đã làm các trick! – shashi

2

Nếu bạn đang sử dụng url mã hóa dữ liệu bài bạn có thể mã hóa url mỗi cặp/giá trị quan trọng của từ điển của bạn sử dụng HttpServerUtility.UrlEncode Method (String)

// Build postData 
StringBuilder post = new StringBuilder(); 
foreach(item in dictionary) { 
    post.AppendFormat("&{0}={1}", item.key, HttpUtility.UrlEncode(item.value)); 
} 
string postData = post.ToString(); 

// HTTP POST 
Uri uri = new Uri(url); 
request = (HttpWebRequest) WebRequest.Create(uri); 
request.Method = "POST"; 
request.ContentType = "application/x-www-form-urlencoded"; 
request.ContentLength = postData.Length; 
using(Stream writeStream = request.GetRequestStream()) 
{ 
    UTF8Encoding encoding = new UTF8Encoding(); 
    byte[] bytes = encoding.GetBytes(postData); 
    writeStream.Write(bytes, 0, bytes.Length); 
} 
+1

Làm theo dòng thứ hai. Lỗi chính tả StringBuilder. –

+0

@JavaScriptDude đã sửa chữa –

0

Bạn có thể muốn sử dụng

http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.aspx

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://url"); 
request.AllowWriteStreamBuffering = true; 
request.Method = "POST"; 
string post = "From=0999999&To=08888888"; 
request.ContentLength = post.Length; 
request.ContentType = "application/x-www-form-urlencoded"; 

StreamWriter writer = new StreamWriter(request.GetRequestStream()); 
writer.Write(post); 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
0

Chỉ trong trường hợp bạn sử dụng HttpWebRequest, mã bên dưới chuyển đổi một số Dictionary<String,String> có tên formVars thành một số byte[] có tên toPost:

byte[] toPost = System.Text.Encoding.UTF8.GetBytes(
    String.Join("&", formVars.Select(x => 
     HttpUtility.UrlEncode(x.Key) + "=" + 
     HttpUtility.UrlEncode(x.Value))); 
); 

Phát bản sao làm việc tại https://dotnetfiddle.net/IOzIE6

Các vấn đề liên quan