#DynamicJsonを使った JSON API リクエスト
VisualStudio2010 (古い…)C# アプリで JSON API を叩きたい!
ディクショナリ(ハッシュ)パラメータのみ対応、
複雑な構成はここでは考えません・・・
環境
開発PC: Windows 10
VisualStudio: 2010
DynamiCJson: 1.2.0
C#
VS2010 プロジェクトにインストール
プロジェクトのパッケージマネージャコンソールを開いてコマンド実行
パッケージマネージャコンソール
Install-Package DynamicJson -Version 1.2.0
使い方説明など
関数用意
SampleJson.cs
/// <summary>
/// ディクショナリからJSON文字列生成
/// </summary>
/// <param name="dict">パラメータディクショナリ</param>
/// <returns>JSON文字列</returns>
public static string DictionaryToJson(IDictionary<string, string> dict)
{
// パラメータディクショナリから json 文字列生成
var entries = dict.Select(d =>
string.Format("\"{0}\": \"{1}\"", d.Key, string.Join(",", d.Value)));
return "{\n" + string.Join(",\n", entries) + "\n}";
}
API呼び出し用メソッド
- JsonWebApi
SampleJson.cs
/// <summary>
/// JSONリクエストAPI
/// </summary>
/// <param name="url">あて先URL</param>
/// <param name="spDic">パラメータディクショナリ</param>
/// <param name="reqParam">リクエストパラメータ</param>
/// <param name="resParam">レスポンスパラメータ</param>
/// <returns>結果DynamicJson</returns>
public static dynamic JsonWebApi(string url, IDictionary<string, string> spDic, ref string reqParam, ref string resParam) {
// WebRequest 生成
var req = WebRequest.Create(url);
//Console.WriteLine("Uri:" + req.RequestUri.AbsoluteUri);
var spJson = "";
byte[] spData = { };
reqParam = "";
resParam = "";
// リクエスト用 json 文字列生成
spJson = DictionaryToJson(spDic);
Console.WriteLine("JsonWebApi JSON:" + spJson);
reqParam = spJson;
spData = Encoding.UTF8.GetBytes(spJson);
req.Method = "POST";
req.ContentType = "application/json";
req.ContentLength = spData.Length;
dynamic jsonResp = new DynamicJson();
jsonResp.Result = "";
jsonResp.Status = "";
jsonResp.Code = "";
jsonResp.Desc = "";
try {
using (Stream reqStream = req.GetRequestStream())
reqStream.Write(spData, 0, spData.Length);
using (var res = req.GetResponse())
using (var s = res.GetResponseStream()) {
// 結果読み取り
string respString = "";
using (var reader = new StreamReader(s, Encoding.UTF8))
respString = reader.ReadToEnd();
Console.WriteLine("JsonWebApi response:" + respString);
resParam = respString;
// json パース
var j = DynamicJson.Parse(respString);
if (j.IsDefined("Result")) {
jsonResp = j;
}
if (j.IsDefined("Status")) {
jsonResp.Status = j.Status;
}
jsonResp.Code = "200";
jsonResp.Desc = respString;
}
}
// エラーハンドリング
catch (WebException webex) {
switch (webex.Status) {
case WebExceptionStatus.Timeout:
case WebExceptionStatus.NameResolutionFailure:
default:
Console.WriteLine("WebException has been occurred:" + webex.Message + ":" + reqParam + ":" + resParam);
break;
}
var exres = (HttpWebResponse)webex.Response;
int statusCode = 0;
if (exres != null) {
var status = exres.StatusCode;
statusCode = (int)status;
Console.WriteLine("StatusCode Error:" + statusCode.ToString() + ":" + reqParam + ":" + resParam);
}
jsonResp.Result = "WEB_EXCEPTION";
jsonResp.Status = "WEB_EXCEPTION";
jsonResp.Code = statusCode.ToString();
jsonResp.Desc = webex.Message;
if (req != null) req.Abort();
if (exres != null) exres.Close();
}
finally {
if (req != null) req.Abort();
}
return jsonResp;
}
実行してみる
Program.cs
static void Main(string[] args) {
string reqParam = "";
string resParam = "";
string url = "https://jsonplaceholder.typicode.com/posts";
SortedDictionary<string, string> dic = new SortedDictionary<string, string>();
dic.Add("Result", "SUCCESS");
dic.Add("Status", "OK");
var response = JsonWebApi(url, dic, ref reqParam, ref resParam);
Console.WriteLine(response);
}
以上、お疲れ様でした!