ASP.NET MVC-cURLなどを使用してアプリケーションでリクエストを実行する

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

質問

ASP.NET MVC(C#を使用)でアプリケーションを構築していますが、curl http://www.mywebsite.com/clients_list.xml 基本的に、Twitter APIなどの編集の表示や削除などのアクションを実行するREST APIの一種を構築したいと思います。

しかし、残念ながら今まで、このWebサイトのウィンドウのcURL以外には何も見つかりませんでした: http:// curl .haxx.se /

だから、削除などのメソッドを使用してURLからこの種の呼び出しを取得する従来の方法があるかどうかはわかりませんが、リクエストを送信するなど...

ASP.NET MVCアプリケーションのコントローラー内でcurlなどのコマンドを実行する簡単な方法を知りたいだけです。


更新:

こんにちは、GETリクエストを行うことができましたが、POSTリクエストの取得で深刻な問題が発生しています。たとえば、curlでは次のように動作するTwitterの更新ステータスAPIを使用しています。

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 Forbiddenを返していることです。 カールで完全に機能するのであれば、なぜかわかりません

:\


更新:

ようやく機能するようになりましたが、おそらくC#を初めて使用するので、よりきれいに美しくする方法があります。それを行うにはより多くの知識が必要になります。ただパラメータを渡すだけのコードがたくさんあるので混乱しています。

まあ、私は要点を作成しました- 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
    */
}
役に立ちましたか?

解決

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スターターキットに含まれています。プレビュー2 、ただし、そこにある他のものとは独立して使用できます。

PS twitterアカウントでこのコードをテストしましたが、動作します。

他のヒント

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

これは、JSONを返すRESTful APIの呼び出しに使用する1行のコードです。

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

メモ

  • UriはsurveyIdと資格情報を使用してステージ外で生成されます
  • 「data」プロパティは、返されるデシリアライズされたJSONオブジェクトの一部です SurveyGizmo APIによって

完全なサービス

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

System.Netを調べます。 WebClient クラス。必要な機能を提供する必要があります。より細かく制御するには、 WebRequest より便利になりましたが、WebClientがニーズに最も適しているようです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top