質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

0回答

1238閲覧

[Swift]レスポンスのBodyの値によって処理を分けたい

yasukun252

総合スコア34

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/09/01 18:44

前提・実現したいこと

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}

アドバイスなど何卒よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yasukun252

2021/09/02 00:59

ご回答ありがとうございます!! .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」は必要なのでしょうか?
hoshi-takanori

2021/09/02 01:09

JSON の場合、json["status"] が文字列とは限らない (数値や論理値や配列やオブジェクトかもしれない) のですが、Swift では == の両辺の型を合わせないと比較できないため as? String が必要になります。(json["status"] が存在しなかったり、文字列以外の場合は json["status"] as? String は nil になり、クラッシュせずに、比較の結果は必ず false になります。)
yasukun252

2021/09/02 01:34

ご回答ありがとうございます!! 以下のようにして解決いたしました。 if json["status"] as? String == "SUCCESS" { // SUCCESSの場合の処理 } else if json["status"] as? String == "VALID" { // VALIDの場合の処理 }
yasukun252

2021/09/02 02:11 編集

こちら解決いたしましたので、ベストアンサーにさせて頂きたいのですが、どうすればよろしいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問