.NETコンソールからJSON WebServiceを呼び出す最良の方法


89

Json文字列を返すASP.Net MVC3でWebサービスをホストしています。C#コンソールアプリケーションからWebサービスを呼び出し、戻り値を.NETオブジェクトに解析する最良の方法は何ですか?

コンソールアプリでMVC3を参照する必要がありますか?

Json.Netには、.NETオブジェクトをシリアル化および逆シリアル化するための優れたメソッドがいくつかありますが、Webサービスから値をPOSTおよびGETする方法があることはわかりません。

または、WebサービスへのPOSTおよびGETのために独自のヘルパーメソッドを作成するだけですか?.netオブジェクトをキーと値のペアにシリアル化するにはどうすればよいですか?

回答:


141

HttpWebRequestを使用してWebサービスからGETすると、JSON文字列が返されます。GETの場合は次のようになります。

// Returns JSON string
string GET(string url) 
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    try {
        WebResponse response = request.GetResponse();
        using (Stream responseStream = response.GetResponseStream()) {
            StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.UTF8);
            return reader.ReadToEnd();
        }
    }
    catch (WebException ex) {
        WebResponse errorResponse = ex.Response;
        using (Stream responseStream = errorResponse.GetResponseStream())
        {
            StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.GetEncoding("utf-8"));
            String errorText = reader.ReadToEnd();
            // log errorText
        }
        throw;
    }
}

次に、JSON.Netを使用して動的に文字列を解析します。または、次のcodeplexツールを使用して、サンプルのJSON出力から静的にC#クラスを生成できます:http ://jsonclassgenerator.codeplex.com/

POSTは次のようになります。

// POST a JSON string
void POST(string url, string jsonContent) 
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";

    System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
    Byte[] byteArray = encoding.GetBytes(jsonContent);

    request.ContentLength = byteArray.Length;
    request.ContentType = @"application/json";

    using (Stream dataStream = request.GetRequestStream()) {
        dataStream.Write(byteArray, 0, byteArray.Length);
    }
    long length = 0;
    try {
        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) {
            length = response.ContentLength;
        }
    }
    catch (WebException ex) {
        // Log exception and throw as for GET example above
    }
}

このようなコードをWebサービスの自動テストで使用しています。


JsonClassGeneratorは素晴らしいです。json文字列を渡すことで厳密に型指定されたオブジェクトを作成するだけなので、逆シリアル化は簡単です。
AaronLS 2012

ASCII以外のセットに文字がある場合は、コードを少し変更する必要があります。ContentLengthは投稿されたコンテンツのバイト数を表すため、技術的にはrequest.ContentLengthをjsonContent.LengthではなくbyteArray.Lengthに設定する必要があります。
Grady Werner、

Encoding.GetEncoding("utf-8")置き換え可能Encoding.UTF8
JoelFan

おかげで、これは非常に役に立ちます
shweta '25 / 01/18

承認トークンの一部として設定されますが、テストが必要な場合はヘッダーを渡す必要がある場合もあります。このリクエストのように。Method= "GET"; request.Timeout = 20000; request.ContentType = "application / json"; request.Headers.Add( "Authorization"、 "Bearer your token:
Kurkula

51

リモートURLからコンテンツをフェッチするWebClient、およびJSONを.NETオブジェクトにデシリアライズするJavaScriptSerializerまたはJson.NET。たとえば、JSON構造を反映するモデルクラスを定義してから、次のようにします。

using (var client = new WebClient())
{
    var json = client.DownloadString("http://example.com/json");
    var serializer = new JavaScriptSerializer();
    SomeModel model = serializer.Deserialize<SomeModel>(json);
    // TODO: do something with the model
}

RestSharpなど、チェックアウトできるRESTクライアントフレームワークもあります。


@BrokeMyLegBiking、どれ?ASPAjaxとは関係ありません。JavaScriptSerializerクラスについて話している場合、それはSystem.Web.Extensionsアセンブリの.NETに組み込まれているため、何もダウンロードしたりインストールしたりする必要はありません。
Darin Dimitrov

ac#オブジェクトのすべてのプロパティ名/プロパティ値をPOSTキーと値のペア(またはGETキーと値のペア)に変換する方法はありますか?c#オブジェクトをWebサービスメソッドへの入力値として効果的に使用できるようにするには?
BrokeMyLegBiking

@BrokeMyLegBiking。これは、所有するオブジェクトと、Webサービスが入力をどのように期待するかによって異なります。
Darin Dimitrov

3
RestSharpライブラリは本当に気に入っています。言及していただきありがとうございます。
ブライアンレイ

1
Darenはこれを更新できます。client.downloadstring()はもはや実行可能ではありません。
JReam

9

既存の回答は有効なアプローチですが、時代遅れです。HttpClientは、RESTful Webサービスを操作するための最新のインターフェースです。リンクのページのサンプルセクションを確認してください。非同期HTTP GETの非常に簡単な使用例があります。

using (var client = new System.Net.Http.HttpClient())
{
    return await client.GetStringAsync("https://reqres.in/api/users/3"); //uri
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.