httpパッケージについて調べたのでメモ書き。
httpパッケージはHTTPリクエスト送信用のFutureベースのライブラリ。
httpパッケージを使うと、簡単にGETやPOSTリクエスト等を送信できる。
公式サイトで導入手順を確認。
pubspec.yamlに以下を追加。最新バージョンは公式サイトで確認の事。
dependencies:
http: ^1.1.0
VS Code等の開発環境であれば、ファイルを保存することでパッケージが追加される。
次にhttpパッケージをimport。エイリアスとして「http」を設定。
import 'package:http/http.dart' as http;
httpパッケージには複数のクラスやメソッドが用意されている。全ては確認しきれないので、代表的なものをいくつか試してみる。
詳細はこちら。
get()メソッド
第1引数ではurlを、第2引数はオプション引数(省略可)でheaderを指定する。
第1引数のurlはUriクラスを使う。Uriコンストラクタではオプション引数として以下プロパティを指定できる。
型 | プロパティ名 | 説明 |
---|---|---|
String | scheme | http等のプロトコル |
String | userInfo | ユーザのログイン情報 |
String | host | ホスト、ドメイン名 |
int | port | 接続先ポート番号 |
String | path | パス |
Iterable<String> | pathSegments | パスを配列で渡す |
String | query | クエリ文字列 |
Map<String,dynamic> | queryParameters | クエリをマップ型で渡す |
String | fragment | フラグメント |
URIパーサーで以下ダミーURLを解析し、実際のプロパティ値を確認してみる。
「https://user01:password@e-trove.biz/path1/path2/path3.php?comment=Get#fragment-1」
final uri = Uri.parse(
'https://user01:password@e-trove.biz/path1/path2/path3.php?comment=Get#fragment-1');
print(uri.scheme);
print(uri.userInfo);
print(uri.host);
print(uri.port);
print(uri.path);
print(uri.pathSegments);
print(uri.query);
print(uri.queryParameters);
print(uri.fragment);
実行結果。
各プロパティ値は以下の通り。
scheme:https
userInfo:user01:password
host:e-trove.biz
port:443
path:/path1/path2/path3.php
pathSegments:[path1, path2, path3.php]
query:comment=Get
queryParameters:{comment: Get}
fragment:fragment-1
それではコーディングでgetメソッドを確認。
第2引数のheaderにCache-Controlを指定。
なお、検証用サイトにはベーシック認証を設定している。
import 'package:http/http.dart' as http;
void main() async {
// ①getメソッド実行
Uri uri1 = Uri(
userInfo: '******:*******',
scheme: 'https',
host: 'e-trove.biz',
path: '/httpclient/sample1.php',
queryParameters: {'comment': 'Getリクエスト'},
);
var response = await http.get(uri1, headers: {'Cache-Control': 'no-store'});
// ②レスポンスを確認
print(
'・${response.statusCode.runtimeType} statusCode:${response.statusCode}');
print('・${response.headers.runtimeType} headers:${response.headers}');
print('・${response.body.runtimeType} body:${response.body}');
print('・${response.bodyBytes.runtimeType} bodyBytes:${response.bodyBytes}');
print(
'・${response.contentLength.runtimeType} contentLength:${response.contentLength}');
print(
'・${response.isRedirect.runtimeType} isRedirect:${response.isRedirect}');
print(
'・${response.persistentConnection.runtimeType} persistentConnection:${response.persistentConnection}');
print(
'・${response.reasonPhrase.runtimeType} reasonPhrase:${response.reasonPhrase}');
}
実行結果。
レスポンスで取得できる”値”と”値の型”は以下の通り。
・int statusCode:200
・_Map<String, String> headers:{x-pst-nginx-cache: MISS, connection: keep-alive, cache-control: max-age=0, no-cache, transfer-encoding: chunked, date: Sun, 15 Oct 2023 03:29:11 GMT, x-debug-too-large: 0, content-encoding: gzip, content-type: text/html; charset=UTF-8, x-debug-non-text: 0, x-xss-protection: 1; mode=block, server: nginx, x-pst-dynamic: EXPIRE/CREATE; 0.879 ms, x-page-speed: 1.13.35.2-0, x-debug-donot-cache: 1, x-content-type-options: nosniff, x-b-cache: B=nil:D=EXPIRE/CREATE, x-pst-version: 3.1.29, x-signature-wexal: KUSANAGI}
・String body:<html>
<head>
<!-- wexal_pst_init.js does not exist -->
<title></title>
</head>
<body>
Getリクエスト
</body>
</html>
・Uint8List bodyBytes:[60, 104, 116, 109, 108, 62, 10, 60, 104, 101, 97, 100, 62, 10, 60, 33, 45, 45, 32, 119, 101, 120, 97, 108, 95, 112, 115, 116, 95, 105, 110, 105, 116, 46, 106, 115, 32, 100, 111, 101, 115, 32, 110, 111, 116, 32, 101, 120, 105, 115, 116, 32, 45, 45, 62, 10, 60, 116, 105, 116, 108, 101, 62, 60, 47, 116, 105, 116, 108, 101, 62, 10, 60, 47, 104, 101, 97, 100, 62, 10, 60, 98, 111, 100, 121, 62, 10, 71, 101, 116, 227, 131, 170, 227, 130, 175, 227, 130, 168, 227, 130, 185, 227, 131, 136, 10, 60, 47, 98, 111, 100, 121, 62, 10, 60, 47, 104, 116, 109, 108, 62, 10]
・int contentLength:122
・bool isRedirect:false
・bool persistentConnection:true
・String reasonPhrase:OK
post()メソッド
第1引数はurl、第2引数はオプション引数header、第3引数はオプション引数bodyを指定する。
urlとheaderはgetメソッドを参照の事。
コーディングでpostメソッドを確認。
import 'package:http/http.dart' as http;
void main() async {
// ①postメソッド実行
Uri uri1 = Uri(
userInfo: '******:*******',
scheme: 'https',
host: 'e-trove.biz',
path: '/httpclient/sample.php',
);
var response = await http.post(uri1, body: {'comment': 'Postリクエスト'});
// ②レスポンスを確認
print(
'・${response.statusCode.runtimeType} statusCode:${response.statusCode}');
print('・${response.headers.runtimeType} headers:${response.headers}');
print('・${response.body.runtimeType} body:${response.body}');
print('・${response.bodyBytes.runtimeType} bodyBytes:${response.bodyBytes}');
print(
'・${response.contentLength.runtimeType} contentLength:${response.contentLength}');
print(
'・${response.isRedirect.runtimeType} isRedirect:${response.isRedirect}');
print(
'・${response.persistentConnection.runtimeType} persistentConnection:${response.persistentConnection}');
print(
'・${response.reasonPhrase.runtimeType} reasonPhrase:${response.reasonPhrase}');
}
実行結果。
・int statusCode:200
・_Map<String, String> headers:{connection: keep-alive, cache-control: max-age=0, no-cache, transfer-encoding: chunked, date: Sun, 15 Oct 2023 03:59:43 GMT, x-debug-too-large: 0, content-encoding: gzip, content-type: text/html; charset=UTF-8, x-xss-protection: 1; mode=block, x-debug-non-text: 0, server: nginx, x-pst-dynamic: EXPIRE/CREATE; 1.000 ms, x-page-speed: 1.13.35.2-0, x-debug-donot-cache: 1, x-content-type-options: nosniff, x-b-cache: B=nil:D=EXPIRE/CREATE, x-pst-version: 3.1.29, x-signature-wexal: KUSANAGI}
・String body:<html>
<head>
<!-- wexal_pst_init.js does not exist -->
<title></title>
</head>
<body>
Postリクエスト
</body>
</html>
・Uint8List bodyBytes:[60, 104, 116, 109, 108, 62, 10, 60, 104, 101, 97, 100, 62, 10, 60, 33, 45, 45, 32, 119, 101, 120, 97, 108, 95, 112, 115, 116, 95, 105, 110, 105, 116, 46, 106, 115, 32, 100, 111, 101, 115, 32, 110, 111, 116, 32, 101, 120, 105, 115, 116, 32, 45, 45, 62, 10, 60, 116, 105, 116, 108, 101, 62, 60, 47, 116, 105, 116, 108, 101, 62, 10, 60, 47, 104, 101, 97, 100, 62, 10, 60, 98, 111, 100, 121, 62, 10, 80, 111, 115, 116, 227, 131, 170, 227, 130, 175, 227, 130, 168, 227, 130, 185, 227, 131, 136, 10, 60, 47, 98, 111, 100, 121, 62, 10, 60, 47, 104, 116, 109, 108, 62, 10]
・int contentLength:123
・bool isRedirect:false
・bool persistentConnection:true
・String reasonPhrase:OK
Client()コンストラクタ
サーバに複数回接続する時に重宝するのがClientコンストラクタ。
接続を維持したまま複数回リクエストできる。
リクエスト送信後はclose()メソッドで通信を閉じる必要がある。
コーディングで確認。
import 'package:http/http.dart' as http;
void main() async {
// ①Clinetインスタンスを作成
var client = http.Client();
// ②postメソッド実行
Uri uri1 = Uri(
userInfo: '******:*******',
scheme: 'https',
host: 'e-trove.biz',
path: '/httpclient/sample.php',
);
var response1 = await client.post(uri1, body: {'comment': 'Postリクエスト'});
print("POST:${response1.statusCode}");
// ③getメソッドを実行
Uri uri2 = Uri(
userInfo: '******:*******',
scheme: 'https',
host: 'e-trove.biz',
path: '/httpclient/sample.php',
query: 'comment=Getリクエスト');
var response2 = await client.get(uri2);
print("GET:${response2.statusCode}");
// ④通信を閉じる
client.close();
}
実行結果。
POST:200
GET:200
コメント