サーバ連携ありのiOSアプリ(swift)をプライベートで開発していて、サーバサイドは同僚の @fukuiretu が開発しています。
通信周りはAlamofireを使っているのですが、サーバ側とのやりとりで知らなかったこと(基本的なこと)があったのでメモっておきます。
問題
データの削除系なんかのAPIでAlamofire
がエラーを出しているのに気づきました。ただしDB等をみてもデータの削除自体は成功しているようです。レスポンスの処理あたりでコケているのでしょうか。
ということでレスポンスをみてみると・・・ステータスコードが204でレスポンスbodyは空だった。
愚かな自分はサーバサイド担当の同僚に「レスポンスが空だからエラーになっている。なんでもいいのでよしなにデータ返してほしい」と伝えた。
同僚からの指摘
それに対する同僚からのリアクションは「そんなバカな・・・」といった感じだった。不審に思った彼はそれからAlamofire
を調べ出した。そしてslack
上でメッセージが届く。
issueのタイトルは、head :no_content (204 status code) returns errorで、確かに今回の話と同じ問題のようだ。
やってみる
Cocoapods
でライブラリの管理をしているのですが、しばらくpod install
していなくて、使っていたAlamofire
に上のissueが対応されたものが含まれていなかった。
最新のものにして動かしてみると・・・あれ、エラーだ。というのは、
let alamofireRequest = Alamofire.request(mutableURLRequest)
.validate(statusCode: 200..<300)
.validate(contentType: ["application/json"]) // ココ
.responseJSON { (req, res, result, error) -> Void in
//...
}
contentType
をjson
でバリデーションしていたからというプチメモで、問題なく動いた!!感謝。
RFCに書いてある
HTTPのステータスコード204、実はこれまで業務で扱ったことなかったので知らなかったのですが、RFC2616
にもある通り(上のissueのやりとりにも出てくる)
http://tools.ietf.org/search/rfc2616#section-10.2.5
The 204 response MUST NOT include a message-body, and thus is always
terminated by the first empty line after the header fields.
ステータスコードが204のときは、レスポンスbodyを含んではならない、とのこと。
知らなかった、、、とはいえAlamofireでもこのissueが対応されたのが2015/8上旬だし、一度はissueもクローズされかかった経緯もあるようだし。ということで書いておきました。