WPFエッセイ(五)--HttpClientサードパーティWebAPIインタフェースへのアクセス
6543 ワード
WPFプロジェクトでは、サードパーティのWebAPIインタフェースからデータを取得する必要がある場合があります.この場合、Systemに使用する必要がある.Net.Httpネーミング空間におけるHttpClientクラスは,コード多重化率を高めるために,HttpClientがAPIインタフェースにアクセスする方法を汎用クラスにするのもよい考えである.
同じサイトの異なるAPIインタフェースにアクセスする必要がある場合が多いため、サイトベースアドレスを共通変数に設定することができ、プロファイルで変更できることが望ましい.
WebAPIベースアドレスの設定
同じサイトの異なるAPIインタフェースにアクセスする必要がある場合が多いため、サイトベースアドレスを共通変数に設定することができ、プロファイルで変更できることが望ましい.
public static readonly string BaseUri = ConfigurationManager.AppSettings["ApiUri"];
GETメソッド
#region GET --
///
/// GET --
///
///
///
///
///
public static async Task TryGetAsync(string action, Dictionary param)
{
using (HttpClient client = new HttpClient())
{
// /
client.BaseAddress = new Uri(BaseUri);
// json
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
//client.DefaultRequestHeaders.Add("Accept-Charset", "GB2312,utf-8;q=0.7,*;q=0.7");
StringBuilder strUri = new StringBuilder();
//
strUri.AppendFormat("{0}?", action);
//
if (param.Count > 0)
{
foreach (KeyValuePair pair in param)
{
strUri.AppendFormat("{0}={1}&&", pair.Key, pair.Value);
}
strUri.Remove(strUri.Length - 2, 2); // '&&'
}
else
{
strUri.Remove(strUri.Length - 1, 1); // '?'
}
HttpResponseMessage response = await client.GetAsync(strUri.ToString());
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsAsync();
}
return default(T);
}
}
#endregion
#region GET --
///
/// GET --
///
///
///
///
public static async Task TryGetAsync(string action)
{
using (HttpClient client = new HttpClient())
{
// /
client.BaseAddress = new Uri(BaseUri);
// json
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await client.GetAsync(action);
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsAsync();
}
return default(T);
}
}
#endregion
POSTメソッド
#region POST --
///
/// POST --
///
///
///
///
///
public static async Task TryPostAsync(string action, object param)
{
using (HttpClient client = new HttpClient())
{
// /
client.BaseAddress = new Uri(BaseUri);
// json
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await client.PostAsync(action, param, new JsonMediaTypeFormatter());
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsAsync();
}
return default(T);
}
}
#endregion
ファイルのアップロード
#region -- --
///
/// -- --
///
///
///
///
///
public static async Task TryUploadAsync(string action, Dictionary filePaths,
Dictionary param)
{
using (HttpClient client = new HttpClient())
{
using (var content = new MultipartFormDataContent())
{
// /
client.BaseAddress = new Uri(BaseUri);
foreach (var filePath in filePaths)
{
var fileContent = new ByteArrayContent(File.ReadAllBytes(filePath.Key));
fileContent.Headers.ContentDisposition =
new ContentDispositionHeaderValue("attachment")
{
FileName = filePath.Value
};
content.Add(fileContent);
}
foreach (var pair in param)
{
var dataContent = new ByteArrayContent(Encoding.UTF8.GetBytes(pair.Value));
dataContent.Headers.ContentDisposition =
new ContentDispositionHeaderValue("attachment") {Name = pair.Key};
content.Add(dataContent);
}
HttpResponseMessage response = await client.PostAsync(action, content);
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsStringAsync();
}
return await Task.FromResult("");
}
}
}
#endregion