C#でcURL呼び出しを行う

私は私のC#コンソールアプリケーションで次のカールコールをしたい:

curl -d "text=This is a block of text" 
    http://api.repustate.com/v2/demokey/score.json

ここに投稿された質問のようにしてみましたが、プロパティを正しく。

私もそれを通常のHTTPリクエストに変換しようとしました:

http://api.repustate.com/v2/demokey/score.json?text="This%20is%20a%20block%20of%20text"

cURL呼び出しをHTTPリクエストに変換できますか?もしそうなら、どうですか?そうでない場合は、C#コンソールアプリケーションから上記のcURL呼び出しを正しく行うにはどうすればよいですか?

63
追加された 著者 Daniel Earwicker,
@DanielEarwicker: HttpClient が混在していて、 HttpClient 上でHTTPコンテンツを取得する方法になるため、 HttpWebRequest と WebClient を使用します。
追加された 著者 casperOne,

3 答え

cURL を直接呼び出すのではなく、次のいずれかのオプションを使用します。

前者の2つよりはるかに優れているように設計されているため、 HttpClient クラスの使用を強くお勧めします。

あなたの場合、あなたはこれを行うでしょう:

using System.Net.Http;

var client = new HttpClient();

// Create the HttpContent for the form to be posted.
var requestContent = new FormUrlEncodedContent(new [] {
    new KeyValuePair("text", "This is a block of text"),
});

// Get the response.
HttpResponseMessage response = await client.PostAsync(
    "http://api.repustate.com/v2/demokey/score.json",
    requestContent);

// Get the response content.
HttpContent responseContent = response.Content;

// Get the stream of the content.
using (var reader = new StreamReader(await responseContent.ReadAsStreamAsync()))
{
   //Write the output.
    Console.WriteLine(await reader.ReadToEndAsync());
}

また、 HttpClient クラスは、さまざまなレスポンスタイプを扱うことができ、前述のオプションよりも非同期操作(およびそれらのキャンセル)のサポートが優れています。

117
追加された
これは、HTTPOnly Cookieを取得する以外はすべて機能します。
追加された 著者 progo,
@casperOne何かを渡す必要がある場合: text = test&activity [動詞] = testVerb FormUrlEncodedContent に複数のキー値ペアを渡すことはできますか?
追加された 著者 Maxsteel,
@Jayはい、asyncとawaitはペアであり、他のペアなしでは使用できません。これは、非同期の包含メソッド(ここには何もありません)を作成する必要があることを意味します。
追加された 著者 casperOne,
これらのメソッドのほとんどは Task を返すので、通常は async を使用して戻り値の型を処理することはできません( Task .Result 。結果を待っているスレッドを浪費しているので、 async を使用する方がよいでしょう。
追加された 著者 casperOne,
@Maxsteelはい、それは KeyValuePair の配列ですので、 new [] {new KeyValuePair ( "text"、 "これはブロックです新しいKeyValuePair <文字列、文字列>( "activity [動詞]"、 "testVerb")}
追加された 著者 casperOne,
@RudyHinojosaそれは本当ではない。 を参照してください。 HttpClient クラスの DefaultRequestHeaders プロパティを使用します。
追加された 著者 casperOne,
私は同様の問題のあなたのコードに従ってみましたが、待っているエラーは非同期メソッドにしか設定できません。
追加された 著者 Jay,
非同期で応答を確認するにはどうすればよいですか?
追加された 著者 Jay,
要求にカスタムヘッダーを追加する必要がある場合は、HttpWebRequest Webreq =(HttpWebRequest)WebRequest.Create([yourUrl]);を使用する必要があります。
追加された 著者 Rudy Hinojosa,
ありがとうキャスパー。私は最後の投稿から多くのRequestHeadersを学びました。私はそれを修正するチャンスがなかった。
追加された 著者 Rudy Hinojosa,
このような電話をかけることができますか? curl -k -i -H "Accept:application/json" -H "Xアプリケーション:" -X POST -d 'username = &password = ' https:// identitysso .betfair.com/api/login
追加された 著者 Murray Hart,

または、 restSharp

var client = new RestClient("https://example.com/?urlparam=true");
var request = new RestRequest(Method.POST);
request.AddHeader("content-type", "application/x-www-form-urlencoded");
request.AddHeader("cache-control", "no-cache");
request.AddHeader("header1", "headerval");
request.AddParameter("application/x-www-form-urlencoded", "bodykey=bodyval", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
10
追加された

以下に、動作するサンプルコードを示します。

Newtonsoft.Json.Linqへの参照を追加する必要があることに注意してください

string url = "https://yourAPIurl"
WebRequest myReq = WebRequest.Create(url);
string credentials = "xxxxxxxxxxxxxxxxxxxxxxxx:yyyyyyyyyyyyyyyyyyyyyyyyyyyyyy";
CredentialCache mycache = new CredentialCache();
myReq.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(credentials));
WebResponse wr = myReq.GetResponse();
Stream receiveStream = wr.GetResponseStream();
StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8);
string content = reader.ReadToEnd();
Console.WriteLine(content);
var json = "[" + content + "]";//change this to array
var objects = JArray.Parse(json);//parse as array  
foreach (JObject o in objects.Children())
{
    foreach (JProperty p in o.Properties())
    {
        string name = p.Name;
        string value = p.Value.ToString();
        Console.Write(name + ": " + value);
    }
}
Console.ReadLine();

Reference: TheDeveloperBlog.com

8
追加された
私は十分にあなたに感謝できない、これは完全に働いた!ありがとうございました!
追加された 著者 Novastorm,