cURLからSwiftへ
curlコマンドを貼り付けると、同じリクエストをURLSessionで行うSwiftコードが出ます。
cURLからSwiftへの変換はブラウザ内でコマンドを解析します。トークンや資格情報が端末から出ることはありません。
APIクライアントを試す
cURLからSwiftへ について
APIのドキュメントはcurlで語り、iOSアプリはURLSessionで語ります。その間を手で訳す作業は単調で、ヘッダーの取りこぼし、JSONにすべきボディを文字列のまま残す、認証オプションを黙って落とすといった小さな間違いを招きます。この変換ツールはcurl自身と同じ流儀でコマンドを解釈し、メソッドを変えるフラグや資格情報をヘッダーに畳み込むフラグも扱い、Foundationだけで動くSwiftを出します。JSONボディは不透明な文字列ではなく、JSONSerializationに渡すSwiftの辞書になります。
機能
- -X、-H、-d、--data-raw、--json、-u、-b、-A、-e、-Gをcurlと同じ流儀で解釈
- Foundation以外に何も必要としないURLSessionのコードを生成
- JSONボディはSwiftの辞書として書き出しJSONSerializationで符号化
- Basic認証は資格情報から組み直し、base64EncodedStringを使用
- ボディの有無からメソッドを推定し、-Xがあればそちらを採用
- Swiftに対応する書き方がないcurlのフラグを警告
- コードをコピーするか.swiftファイルとして保存
cURLからSwiftへ の使い方
- フラグとボディを含めてcurlコマンドを貼り付けます
- 右側に出るSwiftコードを読みます
- 訳せなかったフラグがないか警告を確認します
- コードをコピーするか.swiftとして保存します
例
入力
curl https://api.example.com/users -H 'Content-Type: application/json' -d '{"name":"Ada"}'
出力
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
メソッドはボディの有無から決まります。curlが判断するのと同じやり方です。
よくあるエラーとトラブルシューティング
- curlでは通るのにアプリでは失敗する。 — App Transport Securityを確認してください。iOSは既定で平文HTTPを遮断するため、http://のエンドポイントにはInfo.plistでの例外かhttpsのURLが要ります。
- ビルドは通るのに何も出力されない。 — URLSessionは非同期です。コマンドラインツールでは完了ハンドラが走る前にプロセスが終わります。ランループを保つか、async/awaitのdata(for:)へ切り替えてください。
- -kや--insecureが無視された。 — 意図的です。証明書の検証を省くにはURLSessionDelegateが必要で、明示的に決めるべき事柄です。
- ボディの特殊文字がおかしい。 — 元のコマンドの引用を確認してください。二重引用符のボディは既にシェルを通っています。
よくある質問
- 生成されたSwiftはiOS、macOS、Linuxで動きますか。
- 動きます。FoundationのURLSessionを使い、AppleのプラットフォームでもLinuxのswift-corelibs-foundationでも利用できるため、同じファイルがサーバー側でもビルドできます。
- 完了ハンドラではなくasync/awaitのコードにできますか。
- 生成されるのは完了ハンドラ付きのデータタスクで、どこでも動きます。`let (data, response) = try await URLSession.shared.data(for: request)`に置き換えるのは一行の作業です。
- JSONボディはどう扱われますか。
- 解析してSwiftの[String: Any]辞書として書き出し、JSONSerializationで符号化します。中身が読みやすく、エスケープされた文字列に触れずに値を変えられます。
- -bのクッキーはどうなりますか。
- リクエストのCookieヘッダーになります。URLSessionは独自のクッキー保存領域を持つため、設定によっては追加や上書きが起こる点にご注意ください。
- curlコマンドはどこかへ送信されますか。
- されません。解析もコード生成もブラウザ内で行われます。ドキュメントやログのcurlコマンドには本物のAPIキーが含まれることが多いため、これは重要な点です。
関連ツール
すべての ArrayKit ツール