ASP.NET MVC - Utilisation de cURL ou similaire pour effectuer des demandes dans une application

StackOverflow https://stackoverflow.com/questions/1605814

Question

Je construis une application dans ASP.NET MVC (avec C #) et j'aimerais savoir comment je peux effectuer des appels tels que curl http://www.mywebsite.com/clients_list.xml dans mon contrôleur En gros, je voudrais créer une sorte d’API REST pour effectuer des actions telles que l’affichage et la suppression, telles que l’API Twitter.

Mais malheureusement jusqu'à présent, je n'ai trouvé rien d'autre que cURL pour Windows sur ce site: http: // curl .haxx.se /

Donc, je ne sais pas s’il existe un moyen traditionnel de récupérer ce type d’appel depuis une URL avec des méthodes comme post delete et de mettre les requêtes, etc ...

Je voudrais juste connaître un moyen simple d'exécuter des commandes telles que curl dans mon contrôleur sur mon application ASP.NET MVC.

MISE À JOUR:

Bonjour, j’ai réussi à faire des requêtes GET mais maintenant, j’ai un grave problème de récupération de la requête POST, par exemple, j’utilise l’API de mise à jour de Twitter qui, dans Curl, fonctionnerait comme suit:

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

mais sur mon application ASP.NET MVC, je fais comme ceci dans ma fonction personnalisée:

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;

Maintenant, le problème est que cette demande renvoie 403 Forbidden, Je ne sais vraiment pas pourquoi si cela fonctionne parfaitement sur curl

: \

MISE À JOUR:

Je parviens enfin à le faire fonctionner, mais il y a probablement un moyen de le rendre plus propre et plus beau, comme je suis nouveau en C #, il me faudra plus de connaissances pour le faire, la façon dont les paramètres POST sont passés me rend très confus parce qu'il y a beaucoup de code pour simplement passer des paramètres.

Eh bien, j'ai créé un Gist - http://gist.github.com/215900, alors tout le monde se sent libre de le réviser comme vous voulez. Merci pour votre aide çagdas

suivez également le code ici:

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
    */
}
Était-ce utile?

La solution

Essayez d’utiliser Microsoft.Http.HttpClient. Voici à quoi ressemblerait votre demande

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

Vous pouvez trouver cette bibliothèque et sa source incluses dans le Kit de démarrage WCF REST Preview 2 , mais il peut être utilisé indépendamment du reste.

P.S. J'ai testé ce code sur mon compte twitter et cela fonctionne.

Autres conseils

Exemple de code utilisant HttpWebRequest et 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;
}

Pour poster des données:

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

Il s’agit de la seule ligne de code que j’utilise pour les appels vers une API RESTful qui renvoie JSON.

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

Notes

  • L'Uri est généré hors de la scène à l'aide de surveyId et des informations d'identification
  • La propriété 'data' fait partie de l'objet JSON non sérialisé renvoyé par l'API SurveyGizmo

Le service complet

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

Recherchez dans System.Net. WebClient classe. Il devrait offrir les fonctionnalités dont vous avez besoin. Pour un contrôle plus fin, vous pouvez trouver WebRequest pour être plus utile, mais WebClient semble le mieux adapté à vos besoins.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top