先日出場したハッカソンで、その場で作成したAPIを叩くという機会があったのですが、その時POSTリクエストの投げ方について参考資料が少なく苦戦したので共有します。
この記事はあくまで普段GETリクエストである程度APIをiOSから叩くということに慣れている人対象なので登場するライブラリの基本的な使い方などは別の記事をご覧ください。
Swift3です。
APIKit + Himotokiの場合
APIKitとHimotokiの場合はRequestプロトコルを継承している構造体のmethod
プロパティで.post
を返せば大丈夫です。
parameters
プロパティに辞書を入れておけば自動でJSONに変換して送ってくれるようです。
ですが、この場合少し厄介な仕様があったのでつまりました。というのも普段は既存のAPIを叩くことしかないので遭遇することがほぼないと思うのですが、実はHimotokiはそもそも存在しないJSONのキーをとってこようとするとエラーを投げます。この時APIKitと一緒に使っているとそのエラーをライブラリの内部でキャッチしてしまうため、使っている側には謎のエラーコードを吐いたようにしか見えないのです。
同様にPOSTをする際も、形式が間違っていても使っている側にはそれとわかるようなエラーコードにならないので注意が必要です。
Alamofireの場合
Alamofireの場合は内部での処理が少ない分デバッグが楽です。
例えばJSONを送るようなPOSTリクエストの場合以下のようになります。
var url: String?
var parameters: Parameters?
Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default).response { response in
}
APIKitの場合とちがって、パラメーターを送る形式を自分で指定しなければいけないというところに注意が必要です。特にJSONの場合予測変換で出てくる型名のプロパティにJSONが含まれていなくて、JSONEncoding
の方に存在しているので気をつけましょう。
まとめ
基本的に普通は仕様の確定していないAPIを叩くという機会はほぼないと思うので、今回の僕のようなハマり方をする人は少ないと思うのですが、APIKitが結構パース時のエラーなどを中で処理してしまうのでAPIの仕様が確定するまではAlamofireで、その後APIKitに移行という使い分けもありなのかなと感じました。
APIKit+HimotokiとAlamofire+Himotokiという変換はそこまで難しくなくて、baseURL
をURLにするかStringにするかというところと、Alamofireで受け取ったresponseをうまくHimotokiに投げてやればうまくいきます。一応最後にここのやり方を共有しておきましょう。
このためにはAlamofireから受け取るresponse
の型に注意が必要になります。
まずresponse.result
がResult
型になります。これはAPIKitと同様Resultというライブラリを仕様しているので問題ないでしょう。
そして実際のJSONはresponse.result.value
に入っています。これはAny?
型になっているので基本的にはこれを[String: Any]
にキャストしてからHimotokiのdecodeValue
メソッドに投げてあげればよいです。注意が必要なのはJSONの配列が返って来ている場合で、この時[[String: Any]]
に直接キャストできなかった(たしか)ので今回は
if let jsonArray = response.result.value as? [Any] {
let jsonObject = jsonArray.map {
$0 as! [String: Any]
}
}
というように書いて対処しました。