2009-10-22 26 views
5

Estoy creando una aplicación en ASP.NET MVC (usando C#) y me gustaría saber cómo puedo realizar llamadas como curl http://www.mywebsite.com/clients_list.xml dentro de mi controlador Básicamente, me gustaría construir un tipo de API REST para realizar acciones como editar y eliminar, como Twitter API.ASP.NET MVC - Uso de cURL o similar para realizar solicitudes en la aplicación

Pero, por desgracia, hasta ahora no he encontrado nada, además de que se curvan para las ventanas en este sitio Web: http://curl.haxx.se/

Así que no sé si hay alguna manera tradicional para recuperar este tipo de llamada de URL con los métodos como publicar eliminar y poner en las solicitudes, etc ...

Sólo me gustaría saber una manera fácil de realizar comandos como curl dentro de mi controlador en mi ASP.NET MVC Application.


ACTUALIZACIÓN:

Hola por lo que logró hacer peticiones GET pero ahora estoy teniendo un problema grave en recuperar la solicitud POST, por ejemplo, estoy usando la API de estado de actualización de Twitter que en rizo funcionaría así:

curl -u user:password -d "status=playing with cURL and the Twitter API" http://twitter.com/statuses/update.xml 

pero en mi aplicación ASP.NET MVC que estoy haciendo como esto dentro de mi función personalizada:

string responseText = String.Empty; 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://twitter.com/statuses/update.xml"); 
request.Method = "POST"; 
request.Credentials = new NetworkCredential("username", "password"); 
request.Headers.Add("status", "Tweeting from ASP.NET MVC C#"); 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
using (StreamReader sr = new StreamReader(response.GetResponseStream())) 
{ 
    responseText = sr.ReadToEnd(); 
} 
return responseText; 

Ahora el problema es que esta solicitud está regresando 403 Forbidden, Realmente no sé por qué si funciona perfectamente en rizo

: \


ACTUALIZACIÓN:

que finalmente logran para que funcione, pero probablemente haya una manera de hacerlo más limpio y hermoso, ya que soy nuevo en C#, voy a necesitar más conocimiento para hacerlo, la forma en que se pasan los parámetros POST me confunde mucho porque es una gran cantidad de código para simplemente pasar los parámetros.

Bueno, he creado un Gist - http://gist.github.com/215900, por lo que todos pueden revisarlo como lo desee. Gracias por su ayuda çağdaş

también siguen el código aquí:

public string TwitterCurl() 
{ 
    //PREVENT RESPONSE 417 - EXPECTATION FAILED 
    System.Net.ServicePointManager.Expect100Continue = false; 

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://twitter.com/statuses/update.xml"); 
    request.Method = "POST"; 
    request.Credentials = new NetworkCredential("twitterUsername", "twitterPassword"); 

    //DECLARE POST PARAMS 
    string headerVars = String.Format("status={0}", "Tweeting from ASP.NET MVC C#"); 
    request.ContentLength = headerVars.Length; 

    //SEND INFORMATION 
    using (StreamWriter streamWriter = new StreamWriter(request.GetRequestStream(), ASCIIEncoding.ASCII)) 
    { 
     streamWriter.Write(headerVars); 
     streamWriter.Close(); 
    } 

    //RETRIEVE RESPONSE 
    string responseText = String.Empty; 
    using (StreamReader sr = new StreamReader(request.GetResponse().GetResponseStream())) 
    { 
     responseText = sr.ReadToEnd(); 
    } 

    return responseText; 

    /* 
    //I'M NOT SURE WHAT THIS IS FOR    
     request.Timeout = 500000; 
     request.ContentType = "application/x-www-form-urlencoded"; 
     request.UserAgent = "Custom Twitter Agent"; 
     #if USE_PROXY 
      request.Proxy = new WebProxy("http://localhost:3000", false); 
     #endif 
    */ 
} 
+0

¿Se supone que esos parámetros de nombre de usuario y contraseña son credenciales de red o datos de publicación simple? No conozco la API de Twitter, por lo que sería mejor si explicas qué es exactamente lo que intentas hacer. –

+0

Por cierto, parece que podrías obtener un estado prohibido 403 si llegaste; 1. 1,000 actualizaciones totales por límite de día. 2. 250 mensajes directos totales por límite de día. 3. 150 solicitudes API por límite de horas. http://help.twitter.com/forums/10711/entries/15364 –

+0

lo siento, bueno, en este caso, estoy tratando de conectarme a mi cuenta de Twitter desde http://twitter.com/statuses/update.xml, entonces si intentas acceder a este desde tu navegador verás que pide un nombre de usuario y una contraseña para que las credenciales en este caso sean mi nombre de usuario y contraseña de la cuenta de Twitter, lo que pensé que sería lo mismo de curl -u username: contraseña ... Así que en este método la aplicación se conectaría a mi cuenta de Twitter publicará un nuevo tweet enviando el parámetro "estado" + credenciales, y recuperando la respuesta de que Twitter enviará un archivo xml en este caso. – zanona

Respuesta

3

Trate de usar Microsoft.Http.HttpClient.Esto es lo que su solicitud se vería

var client = new HttpClient(); 
client.DefaultHeaders.Authorization = Credential.CreateBasic("username","password"); 

var form = new HttpUrlEncodedForm(); 
form.Add("status","Test tweet using Microsoft.Http.HttpClient"); 
var content = form.CreateHttpContent(); 

var resp = client.Post("http://www.twitter.com/statuses/update.xml", content); 
string result = resp.Content.ReadAsString(); 

Puede encontrar esta biblioteca y su fuente incluido en el WCF REST Starter kit Preview 2, sin embargo, puede ser utilizado independientemente del resto de las cosas en ese país.

P.S. Probé este código en mi cuenta de Twitter y funciona.

+0

Hola Darrel, gracias por eso parece muy simple, pero lamentablemente por cualquier error no puedo encontrar las clases HttpClient y HttpUrlEncodedForm, ya instalé esta biblioteca WCF pero no puedo encontrarla, incluso en la biblioteca de Microsoft, en realidad no hay Microsoft .Http espacio de nombres aquí, estoy seguro de que estoy haciendo algo mal. Lo siento – zanona

+0

En mi máquina, el dll está aquí C: \ Archivos de programa (x86) \ Microsoft WCF REST \ WCF REST Kit de inicio Vista previa 2 \ Ensamblajes. Además, incluido en el instalador hay un archivo zip que contiene el código fuente. Abra eso y la fuente completa está ahí. –

0

mirada hacia el System.Net. WebClient clase. Debe ofrecer la funcionalidad que necesita. Para un control más detallado, puede encontrar que WebRequest es más útil, pero WebClient parece ser la opción más adecuada para sus necesidades.

2

código Ejemplo utilizando HttpWebRequest y HttpWebResponse:

public string GetResponseText(string url) { 
    string responseText = String.Empty; 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
    request.Method = "GET"; 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    using (StreamReader sr = new StreamReader(response.GetResponseStream())) { 
     responseText = sr.ReadToEnd(); 
    } 
    return responseText; 
} 

para publicar datos:

public string GetResponseText(string url, string postData) { 
    string responseText = String.Empty; 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
    request.Method = "POST"; 
    request.ContentLength = postData.Length; 
    using (StreamWriter sw = new StreamWriter(request.GetRequestStream())) { 
     sw.Write(postData); 
    } 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
    using (StreamReader sr = new StreamReader(response.GetResponseStream())) { 
     responseText = sr.ReadToEnd(); 
    } 
    return responseText; 
} 
+0

muchas gracias por ese çağdaş, ahora estoy teniendo otro problema, he editado la pregunta para que pueda verificar allí si lo desea. gracias de nuevo – zanona

1

Esta es la única línea de código que uso para las llamadas a una API RESTful que devuelve JSON.

return ((dynamic) JsonConvert.DeserializeObject<ExpandoObject>(
     new WebClient().DownloadString(
      GetUri(surveyId)) 
    )).data; 

Notas

  • El URI se genera fuera del escenario utilizando la SurveyID y las credenciales
  • La propiedad 'datos' es parte del objeto-de serializada JSON devuelto por la API SurveyGizmo

El servicio completo

public static class SurveyGizmoService 
{ 
    public static string UserName { get { return WebConfigurationManager.AppSettings["SurveyGizmo.UserName"]; } } 
    public static string Password { get { return WebConfigurationManager.AppSettings["SurveyGizmo.Password"]; } } 
    public static string ApiUri { get { return WebConfigurationManager.AppSettings["SurveyGizmo.ApiUri"]; } } 
    public static string SurveyId { get { return WebConfigurationManager.AppSettings["SurveyGizmo.Survey"]; } } 

    public static dynamic GetSurvey(string surveyId = null) 
    { 
     return ((dynamic) JsonConvert.DeserializeObject<ExpandoObject>(
       new WebClient().DownloadString(
        GetUri(surveyId)) 
      )).data; 
    } 

    private static Uri GetUri(string surveyId = null) 
    { 
     if (surveyId == null) surveyId = SurveyId; 
     return new UriBuilder(ApiUri) 
       { 
         Path = "/head/survey/" + surveyId, 
         Query = String.Format("user:pass={0}:{1}", UserName, Password) 
       }.Uri; 
    } 
} 
Cuestiones relacionadas