【问题标题】:How to access JSON response within URLSession of HTTP Post request?如何在 HTTP Post 请求的 URLSession 中访问 JSON 响应?
【发布时间】:2019-01-11 17:06:43
【问题描述】:

我正在 Xcode 中的 XCTest 框架内发出 http post 请求,以便对我的应用程序进行简单的 UI 测试。在请求中,返回响应。我无法在 URLSession 任务之外访问该响应,我需要这样做,因为它包含一个必须解码并用于另一个 http post 请求的 JWT。

我已经尝试研究如何做到这一点,但由于我是 Swift 的初学者,因此很难知道正确的路径。我尝试创建一个新的 json 对象并将该响应分配给它在 URLSession 之外,但它只是说它找不到该响应,它超出了范围。

// make HTTP request
let task = URLSession.shared.dataTask(with: request) { data, response, error in
    guard let data = data, error == nil else {
        print(error?.localizedDescription ?? "No data")
        return
    }
    let responseJSON = try? JSONSerialization.jsonObject(with: data, options: [])
    if let responseJSON = responseJSON as? [String: Any] {
        print(responseJSON)
    }
}
task.resume()
let response = responseJSON as! [String:Any]

预期的结果是我现在在 http 请求之外有我的响应对象,然后我可以对其进行解码。实际结果就是报错:

使用未解析的标识符“responseJSON”

【问题讨论】:

  • 您无法访问超出其范围的变量。
  • 感谢 rmaddy 的输入。我的问题是如何访问它。
  • 您通常会使用完成处理程序
  • 感谢您输入 Scriptable。我现在就开始研究。
  • 你在声明的地方访问它。

标签: json swift http-post jwt


【解决方案1】:

您发出的请求是异步的。所以当你跑线的时候……

let response = responseJSON as! [String:Any]

网络请求尚未完成。所以你通常会使用一个完成处理程序,当网络返回时会调用它

这是一个示例游乐场:

//: Playground - noun: a place where people can play
import PlaygroundSupport
import UIKit

PlaygroundPage.current.needsIndefiniteExecution = true

func postSomeData(completion: @escaping ([String: Any]?, Error?) -> Void) {
    // setup request
    let url = URL(string: "https://jsonplaceholder.typicode.com/todos/1")
    let request = URLRequest(url: url!)
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil else {
            print(error?.localizedDescription ?? "No data")
            completion(nil, error)
        }
        let responseJSON = try? JSONSerialization.jsonObject(with: data, options: [])
        if let responseJSON = responseJSON as? [String: Any] {
            completion(responseJSON, nil)
        }
    }
    task.resume()
}

postSomeData() { response, error in
    print(response, error)
    PlaygroundPage.current.finishExecution()
}

输出:

可选(["id": 1, "title": delectus aut autem, "completed": 0, "userId": 1]) nil

我还建议您使用Codable 来解析和映射 JSON 响应。 Here is an intro 使用 Codable,但是网上有很多关于这个主题的资源。

【讨论】:

    猜你喜欢
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    相关资源
    最近更新 更多