ちょっと厨二っぽいSEのブログ

プログラミングとかのシステム備忘録など

【Swift】iOSの通信について【GET, POST】

iosで通信処理を実装する方法です。

Androidですと、
threadを作って、そこに通信処理と、コールバック関数を無名クラスで作成したりしますよね。

ではiOSではどうなんでしょう


◆一番単純な書き方

class ViewController: UIViewController {

    override func viewDidLoad() {
        ....

        //urlを生成
        let url:NSURL = NSURL(string:"http://xxx.com")!

        //リクエストを生成
        let request:NSURLRequest  = NSURLRequest(URL: url)

        //リクエストを投げる self.getHttpはレスポンス取得後の処理
        NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: self.getHttp)

    }

    //レスポンス取得後の処理
    func getHttp(response:NSURLResponse?,data:NSData?,error:NSError?){
        print( NSString(data: data!, encoding: NSUTF8StringEncoding)! );
    }

NSOperationQueue.mainQueue()部分がThread部分です。
Androidのように自分で作る必要はなく、あらかじめ用意されたキューを指定します。
この場合はメインスレッドを指定しています。


◆1つの関数内で完結させる

また上記の書き方ではコールバックを別の関数として書いていますが
Swiftの場合、無名関数で書くことが出来ます。

こんな感じ

let url:NSURL = NSURL(string:"http://xxx.com")!
let request:NSURLRequest  = NSURLRequest(URL: url)

NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(),
    completionHandler: {(response:NSURLResponse?, data:NSData?, error:NSError? ) in
        
        print(NSString(data: data!, encoding: NSUTF8StringEncoding)!)
    } )


◆POST通信

NSURLRequestの代わりに、NSMutableURLRequestを使用するとPOSTを送ることができます。

let query = "param1=1&param2=abc&param3=test"
let url:NSURL = NSURL(string:"http://xxx.com")!
let request = NSMutableURLRequest(URL: url!)

request.HTTPMethod = "POST"
request.HTTPBody = query.dataUsingEncoding(NSUTF8StringEncoding)

NSURLConnection.sendAsynchronousRequest(apiRequest, queue: NSOperationQueue.mainQueue(),
    completionHandler: {(response:NSURLResponse?, data:NSData?, error:NSError? ) in
        
        print( NSString(data: data!, encoding: NSUTF8StringEncoding)! )
    } )


以上です。
Androidに比べてスマートに書くことができますね。