2011-10-09 12 views
6

Tengo que integrarme con una API de terceros. Para usar el servicio, tengo que "POST" a una url específica con ciertos parámetros.¿Cuál es la forma equivalente de establecer los parámetros de publicación en .net?

El código de ejemplo proporcionado por el servicio está en php y es el siguiente

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

Estoy tratando de utilizar la clase WebRequest para lograr el mismo en .NET. Sin embargo, estoy un poco confundido acerca de cómo configurar los datos del parámetro post. Pensé que los datos de $ anteriores no son más que un diccionario. Así que creé un diccionario equivalente. Sin embargo, ¿cómo configuro los parámetros de publicación con los valores del diccionario?

En http://msdn.microsoft.com/en-us/library/debx8sh9.aspx, han serializado una cadena a una matriz de bytes y luego se establece como el parámetro de publicación en el flujo de datos. ¿Cómo hago lo mismo con un diccionario?

¿O es mi enfoque incorrecto? ¿Hay una mejor manera de hacer esto?

Respuesta

8

En general, WebClient.UploadValues va a ser el enfoque más fácil aquí; see MSDN for a full example. Sin embargo, tenga en cuenta que esto solo cubre CURLOPT_POSTFIELDS y CURLOPT_POST. El error de falla es automático e implícito, y la respuesta ya está incluida como byte[].

es decir

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 está implícita aquí; si necesita un método http diferente, utilice la sobrecarga:

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

¿Hay un equivalente de CURLOPT_SSL_VERIFYPEER de modo que pueda ignorar cualquier excepción de SSL? El certificado remoto es un certificado SSL autogenerado y los desarrolladores Api de terceros quieren que otros ignoren las advertencias SSL. ¿O el enfoque que se muestra en http://www.ben-morris.com/asp-net-web-services-and-ssl-certificates-establishing-a-trust-relationship es la manera más fácil? ¿Debería ser esta una pregunta separada? – shashi

+1

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

+0

Gracias. Eso hizo el truco! – shashi

2

Si está utilizando URL codificada datos posteriores se puede codificar cada url/valor par de claves de su diccionario utilizando 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

error tipográfico en segunda línea. Malla StringBuilder. –

+0

@JavaScriptDude corregido –

0

Es posible que desee utilizar el

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

En caso de que tiene utilizar HttpWebRequest, el código a continuación convierte un Dictionary<String,String> llamado formVars a un byte[] llamado toPost:

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

Juego con una copia de trabajo en https://dotnetfiddle.net/IOzIE6

Cuestiones relacionadas