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

DRYな備忘録

Don't Repeat Yourself.

【iOS】アプリからHTTPリクエストを送る

iOS Xcode

ゴール

  • iOSクライアントアプリから自前のサーバへHTTPリクエストを送る
  • 結果をクライアントで取得する

f:id:otiai10:20140810144843j:plain

記録

まず空のアプリつくる

  1. Xcode起動
  2. SingleViewApplicationを選択してCreate New
  3. 実機に向けてrunして真っ白画面出ることを確認

詳細割愛

ミニマムなサーバを作る

メッセージを送ると、そのおうむ返しをサーバからのメッセージとともに送り返すだけのサーバ。何でつくってもいい。

詳細割愛

アプリlaunchと同時でよいので

AppDelegate.mのdidFinishLaunchingWithOptionsに以下のコードを書く

f:id:otiai10:20140810144718j:plain

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;
 }

その結果

f:id:otiai10:20140810144843j:plain

いけてるっぽい

詰まったポイント

  1. localhostだとコネクション張れない
    • iPhone実機でやってるからかな
    • シミュレータならいけたのかもしれない
  2. requestオブジェクトのsetHTTPBodyに食わせるDataの作りかたがわからない
    • "foo=hoge&bar=fuga&buz=piyo"というNSStringのdataUsingEncodingを呼べばよかっただけ
    • なので、DictionaryをURIEncodingしてquery stringにする処理は今後書かねばなるまい
  3. response, data, connectionErrorの違いが分からん
    • responseはサーバからのHTTP Response, connectionErrorはクライアントとインターネットの接続だと思えばよろしい
    • response bodyはdataだと思えばよろしい

参考

雑感

  • やってみる → 詰まる → 調べる → やってみる
  • のサイクルを死んだ目で、無心で、回せるようになった
  • よい

DRYな備忘録