はじめに
自分用のメモとして残します。
マエフリ
アプリケーションを実行する上でサーバ通信は欠かせない存在です。
そんな中、クライアントとサーバ間で通信する上でHTTP通信というものがあります。
今回はそのHTTPと非同期処理を組み合わせた記述を紹介します。
※HTTPの仕組みや非同期処理の説明などは知見がある前提です。
コード紹介
Main.swift
//実際に送るJson型のオブジェクト
let params:[String:Any] = [
"id": "Test",
"pass": "1234567890"
]
//トリガー
ApiRequest(params: params,url: "URL", { str in
do{
// パースする
let items = try JSONSerialization.jsonObject(with: str) as! Dictionary<String, Any>
//エラーを吐いているかいないか確認
if items["error_code"] as! Int == 0 {
//成功処理
print("成功!!!")
}
else{
//失敗時エラー処理
print("失敗!!!")
return
}
}
catch{
}
})
//API処理
func ApiRequest(params: [String:Any],url: String, _ after:@escaping (Data) -> ()){
//受け取りデータ
var acceptanceTextData: Data!
//WebAPi 指定
var request = URLRequest(url: URL(string: url)!)
//ヘッダー設定
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
//非同期処理を行う
let dispatchQueue = DispatchQueue(label: "Dispatch Queue", attributes: [], target: nil)
do{
request.httpBody = try JSONSerialization.data(withJSONObject: params, options: .prettyPrinted)
let task:URLSessionDataTask = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: {(data,response,error) -> Void in
let resultData = String(data: data!, encoding: .utf8)!
//Jsonデータをディシリアライズ
var personalData: Data = resultData.data(using: String.Encoding.utf8)!
dispatchQueue.async {
//Dataに格納
acceptanceTextData = personalData
//実際に格納処理している
after(acceptanceTextData)
}
})
task.resume()
}catch{
//ネットワークエラー
return
}
}
コード説明
まずAPIサーバと通信する際だいたい、URLの末尾が処理によって変わる為、毎回毎回HTTP処理のメソッドを記述するのは可読性が悪くなってしまいます。
その為、HTTP処理専用のメソッドを作りAPIサーバと通信をしたいときにJSONを使ったPOST処理の場合は上記に記述した構文を使うことができます。