Frage

Ich baue eine Anwendung in ASP.NET MVC (c #), und ich möchte wissen, wie ich Anrufe wie curl ausführen kann http://www.mywebsite.com/clients_list.xml in meinem Controller Grundsätzlich würde Ich mag eine Art von REST-API bauen Aktionen wie Show bearbeitet auszuführen und löschen, wie Twitter-API.

Aber leider bis jetzt habe ich noch nichts außer diesem cURL fand für Fenster auf dieser Website: http: // curl .haxx.se /

Also ich weiß nicht, ob gibt es eine traditionelle Art und Weise, diese Art von Anruf von URL abgerufen werden mit Methoden wie Post löschen und auf die Anfragen gestellt, etc ...

Ich möchte nur eine einfache Möglichkeit, wissen, Befehle wie Locke in meinem Controller auf meiner ASP.NET MVC-Anwendung auszuführen.


UPDATE:

Hallo, so habe ich es geschaffen GET Requests zu machen, aber jetzt habe ich ein ernstes Problem in beispielsweise POST Anfrage abrufen, ich bin mit dem Update-Status API von Twitter, dass in curl würde wie folgt funktionieren:

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

aber auf meiner ASP.NET MVC-Anwendung Ich bin wie dies in meiner benutzerdefinierten Funktion zu tun:

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;

Nun ist das Problem, dass dieser Antrag zurückkehrt 403 Verboten, Ich weiß wirklich nicht, warum, wenn es perfekt auf curl funktioniert

: \


UPDATE:

Ich schaffe es schließlich, um es zu arbeiten, aber wahrscheinlich gibt es eine Möglichkeit, es sauberer und schöner zu machen, als ich auf C # neu bin, werde ich mehr wissen müssen, es zu tun, die Art, wie die POST params übergeben werden, macht mich sehr verwirrt, weil eine Menge Code ist nur params übergeben.

Nun, ich habe einen Gist erstellt - http://gist.github.com/215900, fühlen sich so jeder frei, es zu überarbeiten, wie Sie werden. Danke für Ihre Hilfe çağdaş

folgt auch hier dem Code:

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
    */
}
War es hilfreich?

Lösung

Versuchen Microsoft.Http.HttpClient verwenden. Dies ist, was Ihre Anfrage wie

aussehen würde
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();

Sie können mit dieser Bibliothek finden und seine Quelle, die in der WCF REST Starter Kit Vorschau 2 , aber es kann dort unabhängig vom Rest des Materials verwendet werden.

P. S. Getestet habe ich diesen Code auf meinem Twitter-Account und es funktioniert.

Andere Tipps

Beispiel-Code mit HttpWebRequest und 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;
}

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

Dies ist die einzige Zeile Code ich für Anrufe an eine RESTful API verwenden, die JSON zurückgibt.

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

Notizen

  • Der Uri wird erzeugt von der Bühne der surveyId und Anmeldeinformationen
  • Die Eigenschaft ‚Daten‘ ist Teil des de-serialisierten JSON-Objekts zurückgegeben durch die Surveygizmo API

Der komplette Service

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

Schauen Sie in die System.Net. WebClient Klasse. Es sollte die Funktionalität bieten die Sie benötigen. Für feinkörnige Kontrolle, können Sie WebRequest mehr nützlich zu sein, aber WebClient scheint die beste Lösung für Ihre Bedürfnisse.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top