Edited at

Alamofireで"HTTPステータスコードが204+レスポンスが空"について

More than 3 years have passed since last update.

サーバ連携ありのiOSアプリ(swift)をプライベートで開発していて、サーバサイドは同僚の @fukuiretu が開発しています。

通信周りはAlamofireを使っているのですが、サーバ側とのやりとりで知らなかったこと(基本的なこと)があったのでメモっておきます。


問題

データの削除系なんかのAPIでAlamofireがエラーを出しているのに気づきました。ただしDB等をみてもデータの削除自体は成功しているようです。レスポンスの処理あたりでコケているのでしょうか。

ということでレスポンスをみてみると・・・ステータスコードが204レスポンスbodyは空だった。

愚かな自分はサーバサイド担当の同僚に「レスポンスが空だからエラーになっている。なんでもいいのでよしなにデータ返してほしい」と伝えた。


同僚からの指摘

それに対する同僚からのリアクションは「そんなバカな・・・」といった感じだった。不審に思った彼はそれからAlamofireを調べ出した。そしてslack上でメッセージが届く。


https://github.com/Alamofire/Alamofire/issues/510

これ違う?


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

//...

}

contentTypejsonでバリデーションしていたからというプチメモで、問題なく動いた!!感謝。


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もクローズされかかった経緯もあるようだし。ということで書いておきました。