1. RestSharp の概要
GitHub -restsharp/RestSharp: .NET 用のシンプルな REST および HTTP API クライアントシンプルな REST および .NET 用の HTTP API クライアント。GitHub でアカウントを作成して、restsharp/RestSharp 開発に貢献します。https://github.com/restsharp/RestSharp Web API インターフェイスは CRUD 操作を実行します。そのような Web API インターフェイスに接続して使用するには、さまざまなオプションがあります。最も人気のあるものの 1 つは Amazon' ■ RestSharp。その主な理由はそのシンプルさです。
RestSharp は、主に RESTful Web サービスの利用を目的としたオープンソースでポータブル (クロスプラットフォーム) の軽量 .NET ライブラリです。RESTful API を使用してデータに対して CRUD (作成、読み取り、更新、削除) 操作を実行できます。RestSharp は、HTTP リクエストの発行と応答の解析のために RESTful API と対話するための人気のあるライブラリです。
RestSharpを使用すると、HTTP リクエストの技術的な詳細を抽象化しながら、RESTful サービスと対話できます。RestSharp は、HTTP クエリの技術的な作業を抽象化しながら、RESTful サービスと対話するための開発者向けのインターフェイスを提供します。RestSharp は、同期リクエストと非同期リクエストの両方を処理できます。
2.レストシャープの使い方
2.1. RestSharp の Nuget パッケージをインストールする
2.2. RestSharpの基本的な使い方
① RestSharp クライアントをインスタンス化する
var client = new RestClient("http://192.168.3.10:8085/api");
② リクエストのインスタンス化(リクエストされたリソース、リソースリクエストのパラメータを含む)
var request = new RestRequest("GetArea");
request.Method = Method.Post;
③実行依頼
var reponse = await client.ExecutePostAsync(request);
2.3. RestSharpの使用例
たとえば、Post タイプであるエリア情報を取得するためのWebApi インターフェイス [ http://192.168.3.10:8085/api/GetArea ] があります。RestSharp を使用して対応する情報を取得する例は次のとおりです。
using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using RestSharp;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
Task<RestResponse> testResult = Test1();
Console.WriteLine($"Main方法:{testResult.GetAwaiter().GetResult().Content}\n\n");
ResultDTO resultDTO = JsonConvert.DeserializeObject<ResultDTO>(testResult.GetAwaiter().GetResult().Content);
Console.WriteLine($"Test1方法:{resultDTO}\n");
//Test11();
Console.ReadLine();
}
//多线程测试
private static void Test11()
{
for (int i = 0; i < 3; i++)
{
ThreadPool.QueueUserWorkItem(new WaitCallback((obj) =>
{
Console.WriteLine($"{DateTime.Now} 启动{obj} 线程");
Task<RestResponse> testResult3 = Test1("http://192.168.3.10:8085/api/", "GetUsers", "{ \"UserName\":\"\"}");
}),i);
}
}
/// <summary>
/// 测试
/// </summary>
/// <param name="baseUrl">WebApi的基础路径</param>
/// <param name="resourceName">WebApi的资源名称</param>
/// <param name="jsonPara">WebApi资源的json参数字符串</param>
/// <returns></returns>
public static async Task<RestResponse> Test1(string baseUrl= "http://192.168.3.10:8085/api/",string resourceName= "GetArea", string jsonPara=null)
{
if (string.IsNullOrEmpty(baseUrl) ||string.IsNullOrEmpty(resourceName)) return null;
var client = new RestClient(baseUrl);
var request = new RestRequest(resourceName);
request.Method = Method.Post;
if (!string.IsNullOrEmpty(jsonPara))
{
request.AddBody(jsonPara);
}
//var reponse = await client.ExecutePostAsync(request);
//ResultDTO resultDTO = JsonConvert.DeserializeObject<ResultDTO>(reponse.Content);
//Console.WriteLine($"Test1方法:{resultDTO}\n");
var reponse = await client.ExecutePostAsync<ResultDTO>(request);
return reponse;
}
/// <summary>
/// 解析Json字符串(首尾没有中括号)【线程安全】
/// </summary>
/// <param name="jsonStr">需要解析的Json字符串</param>
/// <returns>返回解析好的Hashtable表</returns>
private static Hashtable AnalayJsonString(string jsonStr)
{
Hashtable ht = new Hashtable();
if (!string.IsNullOrEmpty(jsonStr))
{
JObject jo = (JObject)JsonConvert.DeserializeObject(jsonStr);
foreach (var item in jo)
{
ht.Add(item.Key, item.Value);
}
}
foreach (DictionaryEntry item in ht)
{
Console.WriteLine(item.Key + " " + item.Value);
}
return ht;
}
#region 解析Json字符串(首尾有中括号)
/// <summary>
/// 解析Json字符串(首尾有中括号[存在相同键])【线程安全】
/// </summary>
/// <param name="jsonStr">需要解析的Json字符串</param>
/// <returns>返回解析好的数据</returns>
public static ConcurrentBag<KeyValuePair<string, object>> AnalayJsonStringMiddleBrackets(string jsonStr)
{
ConcurrentBag<KeyValuePair<string, object>> cb = new ConcurrentBag<KeyValuePair<string, object>>();
if (!string.IsNullOrEmpty(jsonStr))
{
JArray jArray = (JArray)JsonConvert.DeserializeObject(jsonStr);//jsonArrayText必须是带[]字符串数组
if (jArray != null && jArray.Count > 0)
{
foreach (var item in jArray)
{
foreach (JToken jToken in item)
{
string[] strTmp = jToken.ToString().Split(':');
KeyValuePair<string, object> kv = new KeyValuePair<string, object>(strTmp[0].Replace("\"", ""), strTmp[1].Replace("\"", ""));
cb.Add(kv);
}
}
}
foreach (var item in cb)
{
Console.WriteLine(item.Key + " " + item.Value);
}
}
return cb;
}
#endregion
public class ResultDTO
{
public string Success { get; set; }
public string Result { get; set; }
public string StatusCode { get; set; }
public string Message { get; set; }
public override string ToString()
{
string tmp = string.Empty;
if (Result.Contains('['))
{
tmp = $"\nSuccess:{Success}\nStatusCode:{StatusCode}\nMessage:{Message}\nResult:{AnalayJsonStringMiddleBrackets(Result)}\n";
}
else
{
tmp = $"\nSuccess:{Success}\nStatusCode:{StatusCode}\nMessage:{Message}\nResult:{AnalayJsonString(Result)}\n";
}
return tmp;
}
}
}
実行結果は以下の通りです。
3. 参考文献
RestSharp Next (v107+) | RestSharp https://restsharp.dev/v107/#restsharp-v107 RestSharp を使用して Web API を使用する方法 | InfoWorld https://www.infoworld.com/article/3252769/how-to-consume-a-web-api-using-restsharp.html RestSharp で WebAPI を使用する方法 -- Visual Studio マガジンhttps://visualstudiomagazine.com/articles/2015/10/01/consume-a-webapi.aspx