2011-10-09 12 views
6

Devo integrarmi con un'API di terze parti. Per utilizzare il servizio, devo "POST" per un URL specifico con determinati parametri.Qual è il modo equivalente per impostare i parametri del post in .net?

Il codice di esempio fornito dal servizio è in PHP ed è il seguente

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

Sto cercando di utilizzare la classe WebRequest per ottenere lo stesso in .NET. Tuttavia, sono un po 'confuso su come impostare i dati dei parametri post. Ho calcolato che i dati di $ sopra non sono altro che un dizionario. Così ho creato un dizionario equivalente. Tuttavia, come faccio a impostare i parametri del post con i valori del dizionario?

In http://msdn.microsoft.com/en-us/library/debx8sh9.aspx, hanno serializzato una stringa in un array di byte e quindi impostato come parametro post nel dataStream. Come faccio lo stesso per un dizionario?

Oppure il mio approccio è errato? C'è un modo migliore per farlo?

risposta

8

In generale, WebClient.UploadValues sta per essere l'approccio più semplice qui; see MSDN for a full example. Si noti, tuttavia, che questo copre solo CURLOPT_POSTFIELDS e CURLOPT_POST. Errore in caso di errore automatico e implicito e la risposta è già inclusa come byte[].

cioè

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

nota POST è implicita qui; se avete bisogno di un metodo HTTP diverso, utilizzare l'overload:

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

Esiste un equivalente di CURLOPT_SSL_VERIFYPEER tale da ignorare eventuali eccezioni SSL? Il certificato remoto è un certificato SSL generato automaticamente e gli sviluppatori Api di terze parti vogliono che altri ignorino gli avvisi SSL. Oppure l'approccio mostrato su http://www.ben-morris.com/asp-net-web-services-and-ssl-certificates-statablishing-a-trust-relationship nel modo più semplice? Questa dovrebbe essere una domanda a parte? – shashi

+1

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

+0

Grazie. Questo ha fatto il trucco! – shashi

2

Se si utilizza URL codificati i dati post potete url codificare ogni coppia chiave/valore della vostra dizionario con 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

Typo sulla seconda linea. StringBuilder errato. –

+0

@JavaScriptDude corretto –

0

Probabilmente si desidera utilizzare il

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

Solo nel caso in cui si deve usare HttpWebRequest, il codice sotto converte uno formVarsformVarstoPost

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

Gioca con una copia di lavoro a https://dotnetfiddle.net/IOzIE6

Problemi correlati