忘れないようにメモっとく

機械学習とかプログラミングとか。

iPhoneからPOSTリクエスト - AFNetworking

iPhoneのHTTPリクエストが相当めんどくさい。
なにやら設定がごちゃごちゃしてるし、コールバックのDelegateを指定したり、非同期処理を書いたり。

ライブラリもいろんなのがあって、バージョンが違うとか、ARC解除しろだとか。(めんどぅ!)

で、一番使いやすそうなのがAFNetworkingだった。
ここでも、バージョン1.xと2.0で使い分けが必要。

AFNetworking 1.x AFNetworking 2.0
Mac OS X 10.7 Mac OS X 10.8
iOS 5 iOS 6

フレームワークを追加するところから、それぞれの実装までを書いた。

フレームワークの追加

まずは例によって、必要なフレームワークを追加する。ここは両バージョンで共通。
以下の3つ。

Security.framework
CFNetwork.framework
SystemConfiguration.framework

f:id:Akiniwa:20131003103119p:plain

AFNetworking 2.0の実装

https://github.com/AFNetworking/AFNetworking
README.mdを読むと、2.0は

  1. Xcode 5以上
  2. iOS 6.0以上
  3. Mac OS 10.8以上

が必要とのこと
Lion以下の人は1.xを使いましょー。
Requirements

AFNetworking 2.0 and higher requires Xcode 5, targeting either iOS 6.0 and above, or Mac OS 10.8 Mountain Lion (64-bit with modern Cocoa runtime) and above.

For compatibility with iOS 5 or Mac OS X 10.7, use the latest 1.x release.

For compatibility with iOS 4.3 or Mac OS X 10.6, use the latest 0.10.x release.

実装は以下の通り。

#import "AFHTTPRequestOperationManager.h"
/*
---
*/

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *params = @{@"foo[height]": @"200",
                         @"foo[weight]": @"100"};
[manager POST:@"http://yourServer.com/hoge.php" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

AFNetworking 1.xの実装

1.xはここから持ってくる。
AFNetworking/AFNetworking · GitHub

実装は、

#import "AFHTTPClient.h"
/*
---
*/
    NSURL *url = [NSURL URLWithString:@"http://yourServer.com/"];
    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
    NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
                            @"100", @"foo[height]",
                            @"200", @"foo[weight]",
                            nil];

    [httpClient postPath:@"/hoge.php" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSString *responseStr = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        NSLog(@"Request Successful, response '%@'", responseStr);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"[HTTPClient Error]: %@", error.localizedDescription);
    }];

参考はios - AFNetworking Post Request - Stack Overflow