【Swift】URLSession で JSONを POST して JSON のレスポンスを受け取る

先日、紹介しましたこれ。

👉 httpbin.org hatena-bookmark


https://httpbin.org/anything/{anything}

に対して JSONを POST するとそのまま JSONで返ってきます。

キー名は「json」です。

※ 以下では POST してないので null。


{
  "args": {},
  "data": "",
  "files": {},
  "form": {},
  "headers": {
    "Accept": "application/json",
    "Accept-Encoding": "gzip, deflate, br, zstd",
    "Accept-Language": "ja-JP,ja;q=0.9,en-US;q=0.8,en;q=0.7",
    "Content-Length": "0",
    "Host": "httpbin.org",
    "Origin": "https://httpbin.org",
    "Priority": "u=1, i",
    "Referer": "https://httpbin.org/",
    "Sec-Ch-Ua": "\"Google Chrome\";v=\"125\", \"Chromium\";v=\"125\", \"Not.A/Brand\";v=\"24\"",
    "Sec-Ch-Ua-Mobile": "?0",
    "Sec-Ch-Ua-Platform": "\"macOS\"",
    "Sec-Fetch-Dest": "empty",
    "Sec-Fetch-Mode": "cors",
    "Sec-Fetch-Site": "same-origin"
  },
  "json": null,  
  "method": "POST",
  "url": "https://httpbin.org/anything/{anything}"
}

練習してみます。

Web-API を使うには必須です。


struct User: Codable {
  var name: String
  var age: Int
}

struct Anything: Codable {
  var json: User
}


let session = URLSession.shared
let url = URL(string: "https://httpbin.org/anything/{anything}")!
let user = User(name: "John", age: 18)

var request = URLRequest(url: url)
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"
request.httpBody = try JSONEncoder().encode(user)

let (data, response) = try await session.data(for: request)
print((response as! HTTPURLResponse).statusCode)
//print(String(data: data, encoding: .utf8)!)

let receivedUser = (try JSONDecoder().decode(Anything.self, from: data)).json

たくさんのキーを持つ JSON がレスポンスで返ってくる場合は、

必要なキーだけを struct のプロパティ(この場合は「json」)

にすれば良いようです。

これで、

「JSON を使った POSTリクエスト」

「JSON のレスポンスからクラスオブジェクトを取得」

ができますね!

 

🙆🏻‍♂️ 参考

👉 【Swift】 JSONEncoder / JSONDecorder の基本的な使い方 hatena-bookmark


関連ワード:  appleiOSiPhonemacmacOSSwift今さら聞けない初心者開発