Json文字列を返すWebサービスをASP.Net MVC3でホストしています。 C#コンソールアプリケーションからWebサービスを呼び出し、.NETオブジェクトへの戻り値を解析する最良の方法は何ですか?
コンソールアプリでMVC3を参照する必要がありますか?
Json.Netには、.NETオブジェクトをシリアライズおよびデシリアライズするニースのメソッドがいくつかありますが、Webサービスから値をPOSTおよびGETする方法があるとは思いません。
または、WebサービスへのPOSTおよびGETのための独自のヘルパーメソッドを作成する必要がありますか? .netオブジェクトをキーと値のペアにシリアル化するにはどうすればよいですか?
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サービスの自動テストで使用します。
WebClient はリモートURLからコンテンツを取得し、 JavaScriptSerializer または Json.NET は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クライアントフレームワークもあります。
既存の答えは有効なアプローチですが、それらは時代遅れです。 HttpClient はRESTful Webサービスを操作するための最新のインターフェースです。リンクのページの例のセクションを確認してください。非同期HTTP GETの非常に簡単な使用例があります。
using (var client = new System.Net.Http.HttpClient())
{
return await client.GetStringAsync("https://reqres.in/api/users/3"); //uri
}