httpパッケージの利用方法
dartでhttp通信を利用するには、一般的にはhttpパッケージを利用します。httpパッケージを利用する場合には、以下のようにpubspec.yamlにhttpパッケージを追加します。
dependencies: : (省略) http: ^0.13.4
httpパッケージを使ったGETリクエスト
httpパッケージを使ってGETリクエストをする場合の実装例がリスト3です。このような使い方がもっとも簡単な利用方法です。
// (1) httpパッケージのインポート処理 import 'package:http/http.dart' as http; // : (省略) class HttpLoginController extends ILoginController{ Map_config = {}; @override Future config() async{ // (2) リクエストするURLの作成 var url = Uri.parse("http://hostname/config.php"); // (3) GETリクエスト var response = await http.get(url); // (4) ステータスコード if(response.statusCode == 200){ // (5) 日本語が文字化けしてしまう // _config = jsonDecode(response.body) as Map ; // (6) 日本語が含まれている場合 _config = jsonDecode(utf8.decode(response.bodyBytes)) as Map ; return Future.value(true); } else{ return Future.value(false); } } // : (省略) }
httpパッケージを利用するには、(1)のように名前をつけてインポートします。続いて、リクエストするURLは(2)のようにUriクラスのインスタンスを作成します。UriクラスはGETパラメータなどがある場合にはより簡単にリクエストURLの文字列が作成できるようになります。
そして、(3)でGETリクエストを送信します。また、レスポンスコードは(4)のようにstatusCodeで取得可能です。また、(5)のようにレスポンスデータの文字列はbodyで取得できます。今回のレスポンスデータはJSONデータであるため、取得したデータを(5)のようにjsonDecodeを使ってMap形式に変換します。
しかし、レスポンスデータには日本語が含まれているために、この処理では文字化けしてしまうので、bodyプロパティではなく、(6)のようにレスポンスデータのバイトデータを保持するbodyBytesを使います。このデータをutf8でデコードした文字列を使って処理するようにします。
POST処理をする
続いて、POST処理をする場合にはリスト4のように処理します。
class HttpLoginController extends ILoginController{ // (省略) FutureloginForm(String loginId, String password) async { var url = Uri.parse("http://hostname/login/form.php"); // (1) POST処理をする var response = await http.post(url, body : { 'login_id' : loginId, 'password' : password },headers: { 'X-Chat-App-Key' : 'api_key' }); // : (省略) } }
(1)のようにPOSTするデータはbodyに設定し、追加のヘッダがある場合には、headersに設定します。headersはGETリクエストでも利用できます。また、bodyにMap形式を使えば、自動的にリクエストするデータはapplication/x-www-form-urlencoded形式になります。
しかし、POSTデータをJSON形式、つまり、application/json形式でリクエストしたい場合に自動的に変換されるのは困ります。その場合には、リスト5のようにします。
class HttpLoginController extends ILoginController{ // (省略) FutureloginJson(String loginId, String password) async{ var url = Uri.parse("http://hostname/login/json.php"); // (1) Content-Typeを設定する var headers = { 'Content-Type': 'application/json', 'X-Chat-App-Key' : 'api_key' }; var body = { 'login_id' : loginId, 'password' : password }; // (2) bodyにJSONエンコードし設定 var response = await http.post(url, body : jsonEncode(body),headers: headers); // : (省略) } }
Content-Typeのヘッダ情報は(1)のように設定します。ただし、この設定処理はヘッダ情報を変更しているだけです。つまり、実装に送信するデータは(2)のように実際にjsonEncode関数を使ってエンコードしbodyに設定します。
今回はGET/POST処理だけを紹介していますが、他のメソッドも同様なので、詳しくはこちらを参照してください。