HTTPでPOST その2 接続
NSURLConnection
NSURLRequestを作ったら、それを使ってNSURLConnectionのインスタンスを作ります。インスタンスがなくても通信はできるのだけど、Viewを閉じたり、ApplicationがInactivateされた時にも、きちんと通信をキャンセルできるように準備するのが、お行儀のよいアプリ。
まずは、コネクションと、delegateでresponseを保持するための変数をクラスに追加。
NSURLConnection* _conn;
NSHTTPURLResponse* _httpRes;
NSData* _resData;
前回作ったメソッドに渡すパラメータを作成し
NSMutableDictionary* params = [NSMutableDictionary dictionary];
[params setObject:@"value1" forKey:@"key1"]; // パラメータ
NSURL* url = [NSURL URLWithString:@"http://hoge.hoge/hoge"];
リクエストオブジェクトを作って NSURLConnectionオブジェクトを生成するだけ。
NSURLRequest* req = [NetTool createHttpPostRequest:url withParams:params timeoutInterval:60];
_httpRes = nil;
_conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];
これで指定のURLに対してrequestが発行されました。
NSURLConnectionDataDelegate
delegateで非同期通信の結果を受け取ります。以下の4つのメソッドを実装しておけば普通は大丈夫。
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
_conn = nil;
}
サーバーが存在しなかったり回線が不安定でタイムアウトしたりと、通信エラーの際にはこのメソッドが呼ばれる。
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
[_resData setLength:0];
if([response isKindOfClass:[NSHTTPURLResponse class]]){
_httpRes = (NSHTTPURLResponse*)response;
}
}
HTTPヘッダを受信した際に呼ばれる。 受信したデータを格納するためのNSDataオブジェクトを初期化し、後でHTTP ヘッダや応答ステータスを参照するために、レスポンスオブジェクトを保存する
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
[_resData appendData:data];
}
bodyを受信した際に呼ばれる。データをバッファに追記してもよし、都度処理してもよし。Content-Length次第で複数回呼ばれることを考慮すること。
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
_conn = nil;
}
通信エラーが発生した時以外は、必ずこのメソッドが最後に呼ばれる。受け取ったデータを解析したり、画面表示を変えたりといった処理をここで行う。