LoginSignup
1
3

More than 5 years have passed since last update.

URLConnectionでGETにHTTP Bodyを含めるとタイムアウトする

Posted at

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にした方が良いと思います。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3