2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Swift】POSTメソッドを使ってWebAPIを叩く方法

Posted at

Web APIを叩くコードをよく忘れるのでここに書いておこうと思い投稿しました。

叩いてみよう

  • コード全文はGithubにて公開しています(こちらにURL貼ってます)
  • このコードをコピペし、FIXMEの部分を修正すれば使用可能です
  • ResponseHTTPBodyなどはご自身で作成してください
APIClient.swift
struct APIClient {
    // FIXME: URLと取得したAPI Keyを入力してください
    private let urlString: String = ""
    private let apiKey: String = ""
    
    /// データを取得するメソッドです
    ///
    /// ## Return
    /// - `Response`: APIからのレスポンスを格納するStructです。
    /// - `Error`: 通信に失敗した場合などに返すエラーです
    func fetch() async -> Result<Response, Error> {
        do {
            // MARK: - 1.URLを作成する
            // String型で入力されたurlStringをURL型へ変換しています
            guard let url = URL(string: self.urlString) else {
                return .failure(CommunicationErrors.badURL)
            }
            
            // MARK: - 2.URLリクエストを作成する
            func createURLRequest() -> URLRequest {
                var urlRequest = URLRequest(url: url)
                // メソッドの指定(今回はPOSTメソッドを使用)
                urlRequest.httpMethod = "POST"
                
                // MARK: HTTPHeaderを付与する場合
                // FIXME: `["key": "value"]`の部分を使用するサービスが求めているものにしましょう
                // HTTPHeaderに記入する内容はリファレンスに書いてあるはずです
                urlRequest.allHTTPHeaderFields = ["key": "value"]
                
                // MARK: HTTPBodyを付与する場合
                // HTTPBodyも同様にサービスが求めているものを記入しましょう
                // このコードではStructをJSONへエンコードし、httpBodyへ記入しています
                var httpBody: Data? {
                    // FIXME: `HTTPBody()`の部分を変更してください
                    // HTTPBodyに記入する内容はリファレンスに書いてあるはずです
                    // `HTTPBody()`は作成したStructの名前です
                    let encodeValue = HTTPBody()
                    return try? JSONEncoder().encode(encodeValue)
                }
                urlRequest.httpBody = httpBody
                
                return urlRequest
            }
            
            // MARK: - 3.通信を行う
            guard let (data, urlRequest) = try? await URLSession.shared.data(for: createURLRequest()) else {
                return .failure(CommunicationErrors.couldNotCreateRequest)
            }
            
            // MARK: - 4.レスポンスを受け取る
            guard let response = urlRequest as? HTTPURLResponse else {
                return .failure(CommunicationErrors.responseNotReturned)
            }
            // ステータスコードを確認し正常に通信が行われたか確認する
            // ステータスコードが200番台ではなかった場合
            guard 200..<300 ~= response.statusCode else {
                return .failure(CommunicationErrors.badStatusCode(response.statusCode))
            }
            
            // MARK: - 5.JSONをStructへ変換する
            let decodeData = try JSONDecoder().decode(Response.self, from: data)
            return .success(decodeData)
        } catch {
            return .failure(error)
        }
    }
}

// MARK: - データ取得時に発生するエラーを分ける
enum CommunicationErrors: Error {
    case badURL
    case couldNotCreateRequest
    case responseNotReturned
    case badStatusCode(Int)
}
extension CommunicationErrors: LocalizedError {
    // エラーの説明文
    var errorDescription: String? {
        switch self {
        case .badURL:
            return "URLが不正です"
        case .couldNotCreateRequest:
            return "リクエストの作成に失敗しました"
        case .responseNotReturned:
            return "レスポンスがありませんでした"
        case .badStatusCode(let statusCode):
            return "通信ができませんでした statusCode: \(statusCode)"
        }
    }
}

コード全文

こちらになります

参考にした記事等

最後に

最後までご覧いただきありがとうございます🙏
意見等ありましたらコメントいただけると幸いです
分からないことだらけなので、勉強の参考にさせてください😢

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?