cURLからDartへ
curlコマンドを貼り付けると、package:httpで同じリクエストを行うDartコードが出ます。
cURLからDartへの変換はブラウザ内でコマンドを解析します。資格情報が端末から出ることはありません。
Swiftへ変換する
cURLからDartへ について
バックエンドのドキュメントはcurlコマンドを示し、FlutterアプリはDartを必要とします。この変換ツールはその橋渡しをします。curlのフラグをcurl自身と同じ流儀で解釈し、ほぼすべてのDartやFlutterのプロジェクトが既に依存しているpackage:httpを使うコードを出力します。ヘッダーは型付きのマップにまとめられ、JSONボディは貼り付けた文字列ではなくjsonEncodeを通すDartのマップになり、Basic認証はbase64Encodeで組み直されます。省略記法のない動詞はhttp.Requestに回ります。
機能
- -X、-H、-d、--data-raw、--json、-u、-b、-A、-e、-Gをcurlと同じ流儀で解釈
- Dartの標準HTTPクライアントであるpackage:httpを使うコードを生成
- ヘッダーは型付きのMap<String, String>にまとめます
- JSONボディはDartのマップとして書き出しjsonEncodeで符号化
- Basic認証は貼り付けたBase64ではなくbase64Encodeで組み立て
- 省略記法のない動詞にはhttp.Requestを使用
- Dartに対応する書き方がないcurlのフラグを警告
cURLからDartへ の使い方
- APIドキュメントのcurlコマンドを貼り付けます
- 右側に出るDartコードを読みます
- 持ち越せなかったフラグの警告を確認します
- コードをコピーするか.dartファイルとして保存します
例
入力
curl -X PUT https://api.example.com/users/1 -H 'Authorization: Bearer TOKEN' -d '{"role":"admin"}'
出力
final response = await http.put(url, headers: headers, body: body);
動詞は-Xから決まり、JSONボディは符号化の前にDartのマップとして組み立てられます。
よくあるエラーとトラブルシューティング
- 実行時にパッケージが見つからない。 — pubspec.yamlのdependenciesにhttpとして追加し、dart pub getを実行してください。SDKには含まれませんが、Dartチームが保守しています。
- Flutter webでだけ失敗する。 — これはCORSであってコードの問題ではありません。curlが決して見ない同一生成元ポリシーをブラウザが適用するため、APIが適切なAccess-Controlヘッダーを返す必要があります。
- ボディの文字列が妙に展開される。 — Dartではドル記号が補間を始めます。生成される文字列ではエスケープしていますが、手で貼る値は$を\$と書いてください。
- Androidでは動くのにエミュレータのローカルサーバーへ届かない。 — Androidエミュレータはホストのlocalhostを見られません。10.0.2.2を使い、平文HTTPはネットワークセキュリティ設定で許可してください。
よくある質問
- 生成されたコードはFlutterアプリで動きますか。
- 動きます。package:httpはFlutterでも素のDartでも同じ挙動なので、リクエストのコードはそのままサービスクラスに貼れます。最後の出力だけアプリの処理に置き換えてください。
- package:httpとDioのどちらを使うべきですか。
- package:httpは軽い公式の選択肢で、ほとんどのリクエストを賄えます。Dioはインターセプタや中断、マルチパートの利便性を加えますが、APIが近いので移し替えは容易です。
- JSONボディはどう変換されますか。
- 解析してDartのマップリテラルとして書き出し、jsonEncodeで符号化します。入れ子のオブジェクトや配列も読みやすく、値を変数に置き換えるのも簡単です。
- http.getのような補助関数がないメソッドの場合は。
- 動詞を文字列としてhttp.Requestを組み立て、send()で送ります。PURGEやLINKなど、APIが使うどんな動詞にも対応できます。
- 変換のためにcurlコマンドは送信されますか。
- されません。解析もコード生成もブラウザ内で行われるため、コマンド内のトークンやAPIキーは端末に留まります。
関連ツール
すべての ArrayKit ツール