Pergunta

Estou construindo uma aplicação em ASP.NET MVC (usando C #) e eu gostaria de saber como eu pode realizar chamadas como onda http://www.mywebsite.com/clients_list.xml dentro do meu controlador Basicamente eu gostaria de construir uma espécie de API REST para executar ações como show de editar e apagar, como o Twitter API.

Mas, infelizmente, até agora eu não encontrar nada além disso cURL para janelas neste site: http: // onda .haxx.se /

Então, eu não sei se existe alguma maneira tradicional para recuperar esse tipo de chamada de URL com métodos como pós de exclusão e colocar sobre os pedidos, etc ...

Eu só gostaria de saber uma maneira fácil de executar comandos como onda dentro do meu controlador no meu aplicativo MVC ASP.NET.


UPDATE:

Oi então eu consegui fazer solicitações GET, mas agora eu estou tendo um problema sério em recuperar POST Request por exemplo, eu estou usando a API status de atualização do Twitter que na onda funcionaria assim:

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

mas na minha aplicação ASP.NET MVC que eu estou fazendo como este dentro da minha função 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;

Agora o problema é que este pedido está retornando 403 Proibido, Eu realmente não sei porque se ele funciona perfeitamente em onda

: \


UPDATE:

Eu finalmente conseguiu fazê-lo funcionar, mas provavelmente há uma maneira de torná-lo mais limpo e bonito, como eu sou novo em C # eu vou precisar de mais conhecimento para fazê-lo, a forma como os parâmetros POST são passados ??me deixa muito confuso, porque é um monte de código para apenas passar params.

Bem, eu criei um Gist - http://gist.github.com/215900, para que todos se sintam livres para revisá-lo como quiser. Obrigado pela sua ajuda Çagdas

também seguir o código aqui:

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
    */
}
Foi útil?

Solução

Tente usar Microsoft.Http.HttpClient. Isto é o que o seu pedido seria parecido

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

Você pode encontrar esta biblioteca e sua fonte incluído no kit WCF RESTO Iniciado Preview 2 , no entanto, pode ser usado de forma independente do resto das coisas lá dentro.

P.S. Eu testei este código no meu twitter e ele funciona.

Outras dicas

código Exemplo usando HttpWebRequest e 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;
}

dados Para POST:

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;
}

Esta é a única linha de uso de código I para chamadas para uma API RESTful que retorna JSON.

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

Notas

  • O Uri é gerado fora do palco usando o surveyId e credenciais
  • propriedade os 'dados' faz parte do objeto JSON serializada-de devolvidos pela API SurveyGizmo

O Serviço 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;
    }
}

Olhe para o System.Net. WebClient classe. Deve oferecer a funcionalidade necessária. Para um controle mais refinado, que você pode encontrar WebRequest para ser mais útil, mas WebClient parece o mais adequado para suas necessidades.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top