12,925
回編集
編集の要約なし |
(→GET) |
||
206行目: | 206行目: | ||
return resBodyStr; | return resBodyStr; | ||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== POST ==== | |||
以下の例では、リクエストのボディにJSON形式の内容を送受信している。<br> | |||
JSONは、JS、Ruby、Python、PHP等では連想配列を使用して簡単に作成できるが、C#においては<code>Dictionary</code>型を使用および変換後、<code>StringContent</code>型に情報を付加してリクエストに格納する。<br> | |||
<br> | |||
APIの認証方式において、事前に与えられているAPIキーや他の認証情報の文字列を送信する時、認証が成功した場合はアクセストークンを返却して、以降はそのアクセストークンをリクエストヘッダに追加してAPIを呼ぶ場合がある。<br> | |||
その場合は、以下の例と同様の処理となる。<br> | |||
<br> | |||
リクエストのボディにおいて、引数に指定の形式でAPIキー等を格納してPOSTで送信する時、レスポンスのボディの一部にトークンが入って返される。<br> | |||
サンプルコードの内部メソッド AddHeaders() は固定のヘッダー追加しか行っていませんが、ここにトークンがあれば追加するような処理を加えると使い回せます。 | |||
<syntaxhighlight lang="c#"> | |||
// ボディに文字列のキーをJSONで持ってPOSTを送受信する | |||
public string Post(string someKey) | |||
{ | |||
String requestEndPoint = this.baseUrl + "some/post"; | |||
var request = this.CreateRequest(HttpMethod.Post, requestEndPoint); | |||
var jsonDict = new Dictionary<string, string>() { | |||
{"someKey", someKey}, | |||
}; | |||
var reqBodyJson = JsonSerializer.Serialize(jsonDict, this.GetJsonOption()); | |||
var content = new StringContent(reqBodyJson, Encoding.UTF8, @"application/json"); | |||
request.Content = content; | |||
string resBodyStr; | |||
var resStatusCoode = HttpStatusCode.NotFound; | |||
Task<HttpResponseMessage> response; | |||
try | |||
{ | |||
response = httpClient.SendAsync(request); | |||
resBodyStr = response.Result.Content.ReadAsStringAsync().Result; | |||
resStatusCoode = response.Result.StatusCode; | |||
} | |||
catch (HttpRequestException e) | |||
{ // 通信が失敗した場合 | |||
return null; | |||
} | |||
if (!resStatusCoode.Equals(HttpStatusCode.OK)) | |||
{ // レスポンスが200以外の場合 | |||
return null; | |||
} | |||
if (String.IsNullOrEmpty(resBodyStr)) | |||
{ // レスポンスのボディが空の場合 | |||
return null; | |||
} | |||
// 取得した内容 | |||
return resBodyStr; | |||
} | |||
// HTTPリクエストメッセージを生成する | |||
// httpMethod : HTTPメソッドのオブジェクト | |||
// requestEndPoint : 通信先のURL | |||
private HttpRequestMessage CreateRequest(HttpMethod httpMethod, string requestEndPoint) | |||
{ | |||
var request = new HttpRequestMessage(httpMethod, requestEndPoint); | |||
return this.AddHeaders(request); | |||
} | |||
// HTTPリクエストにヘッダーを追加する | |||
// request : リクエスト | |||
private HttpRequestMessage AddHeaders(HttpRequestMessage request) | |||
{ | |||
request.Headers.Add("Accept", "application/json"); | |||
request.Headers.Add("Accept-Charset", "utf-8"); | |||
// 例えば、認証通過後のトークンが "Authorization: Bearer {トークンの文字列}" のように必要な場合は追加する | |||
return request; | |||
} | |||
</syntaxhighlight> | |||
<br> | |||
==== DELETE ==== | |||
<code>GET</code>と同様、HTTPメソッドの<code>DELETE</code>を指定して<code>HttpRequestMessage</code>クラスのインスタンスを生成して渡す。<br> | |||
<br> | |||
JSからの通信では、あまり使用しない。<br> | |||
<syntaxhighlight lang="c#"> | |||
// URLに情報を付加してDELETEを送受信する | |||
public bool Delete(string someId) | |||
{ | |||
String requestEndPoint = this.baseUrl + "some/" + someId; | |||
var request = this.CreateRequest(HttpMethod.Delete, requestEndPoint); | |||
var resStatusCoode = HttpStatusCode.NotFound; | |||
Task<HttpResponseMessage> response; | |||
String resBodyStr; | |||
try | |||
{ | |||
response = httpClient.SendAsync(request); | |||
resBodyStr = response.Result.Content.ReadAsStringAsync().Result; | |||
resStatusCoode = response.Result.StatusCode; | |||
} | |||
catch (HttpRequestException e) | |||
{ // 通信が失敗した場合 | |||
return false; | |||
} | |||
if (!resStatusCoode.Equals(HttpStatusCode.OK)) | |||
{ // レスポンスが200以外の場合 | |||
return false; | |||
} | |||
if (String.IsNullOrEmpty(resBodyStr)) | |||
{ // レスポンスのボディが空の場合 | |||
return false; | |||
} | |||
return true; | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> |