前提・実現したいこと
http://127.0.0.1:3000のAPIから返ってきたレスポンスから値を取得して処理をしたいです。
API通信のライブラリはAlamofire5を利用しております。
[Request]: POST http://127.0.0.1:3000/api/login.json [Headers]: Content-Type: application/json [Body]: {"user":{"email":"","password":""}} [Response]: [Status Code]: 200 [Headers]: Cache-Control: max-age=0, private, must-revalidate Content-Type: application/json; charset=utf-8 Etag: W/"90b1368a958bffbfc9c6656dd1741c28" Referrer-Policy: strict-origin-when-cross-origin Transfer-Encoding: Identity X-Content-Type-Options: nosniff X-Download-Options: noopen X-Frame-Options: SAMEORIGIN X-Permitted-Cross-Domain-Policies: none X-Rack-Dev-Mark-Env: development X-Request-Id: 2c16d10a-691a-4fde-b1dd-d29d9c5458ea X-Runtime: 0.003146 X-XSS-Protection: 1; mode=block [Body]: {"status":"VALID","user":null} <-この部分を取り出したい [Network Duration]: 0.34064602851867676s [Serialization Duration]: 0.0s [Result]: success(Optional(30 bytes))
上記のようなレスポンスが返ってくる場合に、以下のようには書けます。
AF.request("http://127.0.0.1:3000/api/login.json", method: .post, parameters: parameters, encoder: JSONParameterEncoder.default) .validate(contentType: ["application/json"]) .response { response in if response.response?.statusCode == 200 { // 処理 }
しかし、以下のようには書けません。なぜでしょうか?(response.response?.httpBodyが使えない。)
AF.request("http://127.0.0.1:3000/api/login.json", method: .post, parameters: parameters, encoder: JSONParameterEncoder.default) .validate(contentType: ["application/json"]) .response { response in if response.response?.httpBody
以下の部分を使って処理を分けたいと思っております。
[Body]: {"status":"VALID","user":null}
アドバイスなど何卒よろしくお願い致します。
処理をどう分けたいかによると思いますが、responseJSON を使うと楽かも。
https://qiita.com/kaba/items/bbc81ea7c1fbd500bbdb
ご回答ありがとうございます!!
.responseJSON { response in
if let json = response.result.value as? NSDictionary {
print(json)
// 以下のように表示されます。
{
status = VALID;
user = "<null>"
}
}
「status = SUCCESS」の場合もあるため、statusがVALIDかSUCCESSの場合で処理を分けたいです。
以下のように書くのが正解でしょうか?
if json["status"] as? String == "SUCCESS" {
ちなみに、何故「as? String」は必要なのでしょうか?
JSON の場合、json["status"] が文字列とは限らない (数値や論理値や配列やオブジェクトかもしれない) のですが、Swift では == の両辺の型を合わせないと比較できないため as? String が必要になります。(json["status"] が存在しなかったり、文字列以外の場合は json["status"] as? String は nil になり、クラッシュせずに、比較の結果は必ず false になります。)
ご回答ありがとうございます!!
以下のようにして解決いたしました。
if json["status"] as? String == "SUCCESS" {
// SUCCESSの場合の処理
} else if json["status"] as? String == "VALID" {
// VALIDの場合の処理
}
こちら解決いたしましたので、ベストアンサーにさせて頂きたいのですが、どうすればよろしいでしょうか?
あなたの回答
tips
プレビュー