2011-10-28 18 views
58

quiero hacer la siguiente llamada rizo en mi aplicación de consola de C:Realización de una llamada curvatura en C#

curl -d "text=This is a block of text" 
    http://api.repustate.com/v2/demokey/score.json 

he tratado de hacer como la pregunta publicado here, pero no puedo llenar las propiedades correctamente.

También trataron de convertirlo en una solicitud HTTP normal:

http://api.repustate.com/v2/demokey/score.json?text="This%20is%20a%20block%20of%20text" 

¿Puedo convertir una llamada cURL para una petición HTTP? ¿Si es así, cómo? De lo contrario, ¿cómo puedo realizar correctamente la llamada cURL mencionada anteriormente desde mi aplicación de la consola C#?

+0

posible duplicado de [Descarga de archivos utilizando HttpRequest ] (http://stackoverflow.com/questions/4856895/downloading-files-using-httprequest) –

+0

@DanielEarwicker: Diría que no lo es, solo porque 'HttpCli ent' está en la mezcla ahora, y va a ser * la * forma de llevar el contenido HTTP por 'HttpWebRequest' y' WebClient' en el futuro. – casperOne

Respuesta

109

Bueno, no se llamarían cURL directamente, en vez, tendrá que utilizar una de las siguientes opciones:

Recomiendo usar la clase HttpClient, ya que está diseñado para ser mu ch mejor (desde el punto de vista de usabilidad) que los dos anteriores.

En su caso, usted podría hacer esto:

using System.Net.Http; 

var client = new HttpClient(); 

// Create the HttpContent for the form to be posted. 
var requestContent = new FormUrlEncodedContent(new [] { 
    new KeyValuePair<string, string>("text", "This is a block of text"), 
}); 

// Get the response. 
HttpResponseMessage response = await client.PostAsync(
    "http://api.repustate.com/v2/demokey/score.json", 
    requestContent); 

// Get the response content. 
HttpContent responseContent = response.Content; 

// Get the stream of the content. 
using (var reader = new StreamReader(await responseContent.ReadAsStreamAsync())) 
{ 
    // Write the output. 
    Console.WriteLine(await reader.ReadToEndAsync()); 
} 

También tenga en cuenta que la clase HttpClient tiene mucho mejor soporte para el manejo de diferentes tipos de respuesta, y mejor soporte para operaciones asíncronas (y la cancelación de ellos) a lo largo las opciones mencionadas anteriormente.

+4

He intentado seguir su código para un problema similar, pero me están dando errores que solo pueden configurarse para los métodos asíncronos. – Jay

+0

@Jay Sí, async y espera son un par, no puedes usar uno sin el otro. Esto significa que tiene que hacer asincrónico el método contenedor (del que no hay ninguno aquí). – casperOne

+0

¿Cómo podría verificar la respuesta sin asincronizar? – Jay

7

A continuación se muestra un código de ejemplo de trabajo.

Tenga en cuenta que necesita para agregar una referencia a Newtonsoft.Json.Linq

string url = "https://yourAPIurl" 
WebRequest myReq = WebRequest.Create(url); 
string credentials = "xxxxxxxxxxxxxxxxxxxxxxxx:yyyyyyyyyyyyyyyyyyyyyyyyyyyyyy"; 
CredentialCache mycache = new CredentialCache(); 
myReq.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(credentials)); 
WebResponse wr = myReq.GetResponse(); 
Stream receiveStream = wr.GetResponseStream(); 
StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8); 
string content = reader.ReadToEnd(); 
Console.WriteLine(content); 
var json = "[" + content + "]"; // change this to array 
var objects = JArray.Parse(json); // parse as array 
foreach (JObject o in objects.Children<JObject>()) 
{ 
    foreach (JProperty p in o.Properties()) 
    { 
     string name = p.Name; 
     string value = p.Value.ToString(); 
     Console.Write(name + ": " + value); 
    } 
} 
Console.ReadLine(); 

Referencia: TheDeveloperBlog.com

+0

No puedo agradecerle lo suficiente, ¡esto funcionó a la perfección! ¡Gracias! – Novastorm

8

O en restSharp:

var client = new RestClient("https://example.com/?urlparam=true"); 
var request = new RestRequest(Method.POST); 
request.AddHeader("content-type", "application/x-www-form-urlencoded"); 
request.AddHeader("cache-control", "no-cache"); 
request.AddHeader("header1", "headerval"); 
request.AddParameter("application/x-www-form-urlencoded", "bodykey=bodyval", ParameterType.RequestBody); 
IRestResponse response = client.Execute(request); 
Cuestiones relacionadas