この記事では、SwiftUIと、Django Rest Frameworkを利用するプロジェクトで、API接続(GET、PUSH、POST、DELETE)を行う方法を解説しています。
◆動作検証環境
・XCode:12.1
・SwiftUI:2.0
・DjangoRESTframework: 3.12.1
SwiftUIのDjango-REST-Frameworkを使ったAPI接続【GET】
基本となるGET接続のコードは以下のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | func makeGetCall() { var tokenKey = "xxxxxxxxxxxxxxxxxxxxxxx" var endpoint = "https://sample.com/api/info/" // Set up the URL request guard let url = URL(string: endpoint!) else { print("Error: cannot create URL") return } var urlRequest = URLRequest(url: url) urlRequest.addValue("token \(tokenKey)", forHTTPHeaderField: "authorization") // set up the session let config = URLSessionConfiguration.default let session = URLSession(configuration: config) // make the request let task = session.dataTask(with: urlRequest) { (data, response, error) in // check for any errors guard error == nil else { print("error calling GET") return } // make sure we got data guard let responseData = data else { print("Error: did not receive data") return } // parse the result as JSON, since that's what the API provides DispatchQueue.main.async { do{ self.arrayDbVegetableInfos = try JSONDecoder().decode([Infos].self, from: responseData) }catch{ print("Error: did not decode") return } self.isLoading = false } } task.resume() } |
ポイント
14行目:バックエンドの設定でAPI接続の際にTokenキーを利用する設定にしているため、urlRequest.addValue() としています。
35行目:GET接続で取得するデータを、SwiftUIで利用できるようにするため、デコードを行っています。[Infos]型を指定していますが、ここの型は取得元のデータに合わせて作成します。
SwiftUIのDjango-REST-Frameworkを使ったAPI接続【POST】
基本となるPOST接続のコードは以下のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | func makePostCall() { var tokenKey = "xxxxxxxxxxxxxxxx" let endpoint: String = "https://sample.com/api/add/" guard let url = URL(string: endpoint) else { print("Error: cannot create URL") return } var urlRequest = URLRequest(url: url) urlRequest.addValue("token \(tokenKey)", forHTTPHeaderField: "authorization") urlRequest.httpMethod = "POST" urlRequest.addValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") let newInfo:[String:Any]=[ "task": "", "memo":"Test Memo", "user":"100" ] let jsonInfo: Data do { jsonInfo = try JSONSerialization.data(withJSONObject: newInfo, options: []) urlRequest.httpBody = jsonInfo } catch { print("Error: cannot create JSON from newInfo") return } let session = URLSession.shared let task = session.dataTask(with: urlRequest) { [self] (data, response, error) in guard error == nil else { print("error calling Put") return } guard let responseData = data else { print("Error: did not receive data") return } guard let response = response as? HTTPURLResponse else { print("Error: did not response data") return } // parse the result as JSON, since that's what the API provides do { guard let receivedData = try JSONSerialization.jsonObject(with: responseData, options: []) as? [String: Any] else { print("Could not get JSON from responseData as dictionary") return } print("The request is: " + receivedData.description) guard let id = receivedData["id"] as? Int else { print("Could not get ID as int from JSON") return } } catch { print("error parsing response from POST") return } } task.resume() } |
ポイント
14行目:urlRequest.httpMethod = "POST" とし、httpMethodを”POST”に指定しています。(指定しない場合は”GET”となります)
17行目:POSTする値を配列で作成します。
23行目:配列で作成した値を、JSON形式にシリアライズしています。
SwiftUIのDjango-REST-Frameworkを使ったAPI接続【PUT】
基本となるPUT接続のコードは以下のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | func makePutCall(pk:Int) { var tokenKey = "xxxxxxxxxxxxxxxx" let pk = pk let endpoint: String = "https://sample.com/api/update/\(pk)/" guard let url = URL(string: endpoint) else { print("Error: cannot create URL") return } var urlRequest = URLRequest(url: url) urlRequest.addValue("token \(tokenKey)", forHTTPHeaderField: "authorization") urlRequest.httpMethod = "PUT" urlRequest.addValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") let newInfo:[String:Any]=[ "task": "", "memo":"Test Memo", "user":"100" ] let jsonInfo: Data do { jsonInfo = try JSONSerialization.data(withJSONObject: newInfo, options: []) urlRequest.httpBody = jsonInfo } catch { print("Error: cannot create JSON from newInfo") return } let session = URLSession.shared let task = session.dataTask(with: urlRequest) { [self] (data, response, error) in guard error == nil else { print("error calling Put") return } guard let responseData = data else { print("Error: did not receive data") return } guard let response = response as? HTTPURLResponse else { print("Error: did not response data") return } // parse the result as JSON, since that's what the API provides do { guard let receivedData = try JSONSerialization.jsonObject(with: responseData, options: []) as? [String: Any] else { print("Could not get JSON from responseData as dictionary") return } print("The request is: " + receivedData.description) guard let id = receivedData["id"] as? Int else { print("Could not get ID as int from JSON") return } } catch { print("error parsing response from POST") return } } task.resume() } |
PUTの接続は、POSTと共通するコードがほとんどです。
httpMethodを”PUT”指定する点以外は共通のコードとすることができます。
ポイント
2,5,6行目:更新するデータを指定する必要があるので、引数でPK(プライマリーキー)を受け取り、エンドポイントで指定しています。
14行目:urlRequest.httpMethod = "POST" とし、httpMethodを”PUT”に指定しています。
SwiftUIのDjango-REST-Frameworkを使ったAPI接続【DELETE】
基本となるDELETE接続のコードは以下のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | func makeDeleteCall(pk:Int) { let pk = pk let endpoint: String = "https://sample.com/api/delete/\(pk)/" guard let url = URL(string: endpoint) else { print("Error: cannot create URL") return } var urlRequest = URLRequest(url: url) urlRequest.addValue("token \(self.tokenKey)", forHTTPHeaderField: "authorization") urlRequest.httpMethod = "DELETE" let session = URLSession.shared let task = session.dataTask(with: urlRequest) { (data, response, error) in guard error == nil else { print("error calling DELETE") return } } task.resume() } |
ポイント
2,4,6行目:削除するデータを指定する必要があるので、引数でPK(プライマリーキー)を受け取り、エンドポイントで指定しています。
14行目:urlRequest.httpMethod = "DELETE" とし、httpMethodを”DELETE”に指定しています。
以上、SwiftUIと、Django Rest Frameworkを利用するプロジェクトで、API接続(GET、PUSH、POST、DELETE)を行う方法を紹介しました。