ASP.NET MVC - Использование cURL или аналогичного для выполнения запросов в приложении - PullRequest
5 голосов
/ 22 октября 2009

Я создаю приложение в ASP.NET MVC (используя C #), и я хотел бы знать, как я могу выполнять вызовы типа curl http://www.mywebsite.com/clients_list.xml внутри моего контроллера По сути, я хотел бы создать своего рода REST API для выполнения таких действий, как show edit и delete, таких как Twitter API.

Но, к сожалению, до сих пор я не нашел ничего, кроме этого cURL для Windows на этом сайте: http://curl.haxx.se/

Так что я не знаю, существует ли какой-либо традиционный способ извлечения такого рода звонков из URL с помощью таких методов, как удаление записей и добавление запросов и т. Д. *

Я просто хотел бы знать простой способ выполнения таких команд, как curl, внутри моего контроллера в моем приложении ASP.NET MVC.


UPDATE:

Привет, поэтому мне удалось сделать GET-запросы, но теперь у меня возникла серьезная проблема при получении POST-запроса, например, я использую API состояния обновления из Twitter, который в curl будет работать так:

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

но в моем приложении ASP.NET MVC я делаю так внутри своей пользовательской функции:

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;

Теперь проблема в том, что этот запрос возвращает 403 Запрещено, Я действительно не знаю почему, если он отлично работает на curl

: \


UPDATE:

Мне, наконец, удается заставить его работать, но, возможно, есть способ сделать его чище и красивее, поскольку я новичок в C #, мне понадобятся дополнительные знания, чтобы сделать это, способ передачи параметров POST делает меня очень сбит с толку, потому что много кода просто для передачи параметров.

Ну, я создал Gist - http://gist.github.com/215900, так что каждый может смело пересматривать его по своему усмотрению. Спасибо за помощь çağdaş

также следуйте коду здесь:

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
    */
}

Ответы [ 4 ]

3 голосов
/ 23 октября 2009

Попробуйте использовать Microsoft.Http.HttpClient. Вот как будет выглядеть ваш запрос

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

Вы можете найти эту библиотеку и ее источник, включенные в WCF REST Starter kit Preview 2 , однако ее можно использовать независимо от остального содержимого.

P.S. Я проверил этот код на своем аккаунте в твиттере, и он работает.

2 голосов
/ 22 октября 2009

Пример кода с использованием HttpWebRequest и 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;
}

Для данных 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;
}
1 голос
/ 01 мая 2012

Это единственная строка кода, которую я использую для вызовов RESTful API, который возвращает JSON.

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

Примечания

  • Uri генерируется вне сцены с использованием surveyId и учетных данных
  • Свойство data является частью возвращенного десериализованного объекта JSON API SurveyGizmo

Полный сервис

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;
    }
}
0 голосов
/ 22 октября 2009

Посмотрите на класс System.Net. WebClient . Он должен предлагать вам необходимые функции. Для более детального контроля WebRequest может оказаться более полезным, но WebClient кажется наиболее подходящим для ваших нужд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...