URLConnectionというかAFNetworkingを使って、HTTP GETにHTTP Bodyを含めたら、なんでかタイムアウトする問題に遭遇。一回うまくいったような気がしたのに?curlコマンドではうまくいく。
キャッシュの問題かと思ってその辺もいじったけどダメ。HTTP Bodyを空にしたらサーバーからレスポンスが返ってくる。なんでだ・・・
そこでこんな記事を発見。内容はiOSではなくPHPですが。
PHPのcURLもGETにHTTP Bodyを含めると中身が消える問題があるらしい。RFCの仕様上でもGETのHTTP Bodyはサーバー側で無視して良いらしい。どうもその辺のからみでうまくいかないっぽい。
そんなわけで、サーバー側でHTTP Bodyではなく、クエリーパラメータでパラメータを受け取るか、POSTリクエストに変更することで対応できました。サーバー側を修正してもらえないプロジェクトだと死ぬかもしれない・・・
ちなみにAFNetworkingのAFHTTPRequestSerializerは、デフォルトでGET、HEAD、DELETEはHTTP Bodyを使わない実装を発見した。
クエリーパラメータにするデフォルトのHTTPメソッド達
self.HTTPMethodsEncodingParametersInURI = [NSSet setWithObjects:@"GET", @"HEAD", @"DELETE", nil];
クエリーパラメータに連結している
if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]]) {
if (query && query.length > 0) {
mutableRequest.URL = [NSURL URLWithString:[[mutableRequest.URL absoluteString] stringByAppendingFormat:mutableRequest.URL.query ? @"&%@" : @"?%@", query]];
}
} else {
HTTPMethodsEncodingParametersInURIからGETを取り除いてリクエストを投げるとHTTP Bodyにパラメータが入るけど、タイムアウトする場合があると思います。自分はそうなり、この記事を書くことになりました・・・
このことから、GETだけでなくHEAD、DELETEもHTTP Bodyは使わず、使うのはPOST、PUT、PATCHにした方が良いと思います。