読者です 読者をやめる 読者になる 読者になる

AFHTTPClient の getPath が送信するリクエストのクエリ文字列で試行錯誤した話

AFHTTPClient の getPath に

[client getPath:@"user/tasks"
     parameters:@{ @"status": @[@"completed", @"new"] }
        success:^(AFHTTPRequestOperation *operation, id responseObject) {
        }
        failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        }];

という風に、配列を含んだ辞書を渡すと、リクエストのクエリ文字列は

status[]=completed&status[]=new

になる。Rails なんかでよく見る書式だ。

さてここで問題。 リクエストのクエリ文字列を

status=completed&status=new

にしたい場合はどうすればいい? ちなみに NSDictionary のキーは重複が許されない。

答え、というか自分が採用したのは

[client getPath:@"user/tasks?status=completed&status=new"
     parameters:nil
        success:^(AFHTTPRequestOperation *operation, id responseObject) {
        }
        failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        }];

という風に path にあらかじめクエリを埋め込んでしまう方法。

AFHTTPClient の getPath は、path に既にクエリが含まれている場合、parameters をクエリ文字列に変換し & で後ろに足してくれる。ソースコード読んで知った。

ていうか今回、上記のクエリを送信する必要がある Web API に遭遇したんだけど、 「なんで status[] じゃないんだよ」って思ったね。