ゴール
- iOSクライアントアプリから自前のサーバへHTTPリクエストを送る
- 結果をクライアントで取得する
記録
まず空のアプリつくる
- Xcode起動
- SingleViewApplicationを選択してCreate New
- 実機に向けてrunして真っ白画面出ることを確認
詳細割愛
ミニマムなサーバを作る
メッセージを送ると、そのおうむ返しをサーバからのメッセージとともに送り返すだけのサーバ。何でつくってもいい。
詳細割愛
アプリlaunchと同時でよいので
AppDelegate.mのdidFinishLaunchingWithOptionsに以下のコードを書く
diff --git a/iHttpRequestSample/HttpRequestSampleAppDelegate.m b/iHttpRequestSample/HttpRequestSampleAppDelegate.m index 5c1467a..67ff92b 100644 --- a/iHttpRequestSample/HttpRequestSampleAppDelegate.m +++ b/iHttpRequestSample/HttpRequestSampleAppDelegate.m @@ -13,6 +13,23 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launch. + + // (1) URLをつくる(localhostだとダメっぽかったので、適当につくったHTTPサーバ) + NSURL *url = [NSURL URLWithString:@"http://otiai10.com:8080"]; + // (2) Requestをつくる + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; + // (3) メソッドを指定 + [request setHTTPMethod:@"POST"]; + // (4) リクエストボディを指定 + [request setHTTPBody:[@"message=てすてすこちらiOSクライアント" dataUsingEncoding:NSUTF8StringEncoding]]; + // (5) Connectionをつくる + [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { + if (connectionError != nil) { + NSLog(@"%@", connectionError); + return; + } + NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); + }]; return YES; }
その結果
いけてるっぽい
詰まったポイント
- localhostだとコネクション張れない
- iPhone実機でやってるからかな
- シミュレータならいけたのかもしれない
- requestオブジェクトのsetHTTPBodyに食わせるDataの作りかたがわからない
- "foo=hoge&bar=fuga&buz=piyo"というNSStringのdataUsingEncodingを呼べばよかっただけ
- なので、DictionaryをURIEncodingしてquery stringにする処理は今後書かねばなるまい
- response, data, connectionErrorの違いが分からん
- responseはサーバからのHTTP Response, connectionErrorはクライアントとインターネットの接続だと思えばよろしい
- response bodyはdataだと思えばよろしい
参考
- いつか見た惑星: iOSでHTTPリクエストする
- NSURLConnection Class Reference
- NSData Class Reference
- iphone - Convert NSData to String? - Stack Overflow
- NSString Class Reference
- iphone - Printing NSData using NSLog - Stack Overflow
- iphone - How to pass NSData as NSString and get it back? - Stack Overflow
- NSMutableURLRequest Class Reference
- どうしてもわからないObjective-C: オブジェクトの初期化
- NSDataクラス | Second Flush
- NSData - iPhoneアプリ開発の虎の巻
- NSURLConnectionを使ってサーバーにデータを送信する | なんてこったいブログ
雑感
- やってみる → 詰まる → 調べる → やってみる
- のサイクルを死んだ目で、無心で、回せるようになった
- よい
DRYな備忘録