【Swift】URLSessionを使ってPOST送信を行う方法

ちょっと手こずったので、備忘録とコピペ元も兼ねてまとめ。
URLSession を使って Swift でPOST 送信を行う方法についてです。
こちらはログインページとかで使うことが多いと思います。

007 POSTを送信する・GitBook
http://docs.fabo.io/swift/connection/007_post.html

 

いきなり全コードを載せます。
ほぼ上記の参考サイトのコードをコピペしておりますので、そちらをご覧いただいてもOKです。
なお、ViewControllerURLSessionDelegateURLSessionDataDelegate を追加するのを忘れないようにしてください。

// 通信用のConfigを生成.
let config:URLSessionConfiguration = URLSessionConfiguration.background(withIdentifier: "login")
// Sessionを生成.
let session: URLSession = URLSession(configuration: config, delegate: self, delegateQueue: nil)
// 通信先のURLを生成.
let myUrl:URL = URL(string: "[POST先のURL]")!
// POST用のリクエストを生成.
var myRequest:URLRequest = URLRequest(url: myUrl)
myRequest.httpMethod = "POST"
// 送信するデータを生成、リクエストにセット.
let str: NSString = "username=\(username)&password=\(password)" as NSString
let myData: NSData = str.data(using: String.Encoding.utf8.rawValue)! as NSData
myRequest.httpBody = myData as Data

// タスクの生成.
let task: URLSessionDataTask = session.dataTask(with: myRequest as URLRequest)
// タスクの実行.
task.resume()

なおこちらはログイン時に使っている処理です。
各行で行なっているのはコメントに書いてある通りの処理ですので、それらを追ってもらえば大体内容は分かるかと思います。

個人的に詰まったのは 11行目からの送信するデータのセット部分です。
他に見た参考サイトなどの書き方ではうまくデータが送れず、かつ送信するデータが 1つだけの場合を想定したコードばかりだったので、上のサンプルコードのように、ユーザ名とパスワードなど複数データを送るときはどうしたら!?となっていました。
結論としては、送信したいデータを & で結合すればOKです。

なお、最後の行で task.resume() を行なった後は、下記のデリゲートが呼び出されます。

func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
    // 帰ってきたデータを文字列に変換.
    do {
        let json: NSDictionary = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! NSDictionary
        // 後は任意の処理を実行
    } catch {
        print("parse error")
    }
}

私の環境では、POST送信した後に返ってくるデータは JSON だったので、NSDictionary 型の扱いやすい形にパースしています。
あとは、返ってきた値を保存するなど、行いたい処理を実行してください。

また、今回のサンプルコードでは使用していませんが、関数内で session.configuration.identifier を使うと、上のサンプルコードの2行目 URLSessionConfiguration.background で指定した Identifier を取得することができます。
同じページで違う POST 送信をする際でも、送信後に呼び出されるデリゲートは同一なので、こちらを使用して取得できる Identifier で処理の切り分けを行なっています。
なので、ログイン・ログアウトなど POST 送信後の処理が異なる場合は、違う Identifier を指定して、異なる処理を行えるようにしましょう。

 

以上、Swift の URLSession を使って POST 送信を行う方法でした。
ご参考になれば幸いです。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG