ASP.NET MVC - usando curl ou similar para executar pedidos em aplicação
-
05-07-2019 - |
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
*/
}
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
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.