如何在HTTP Post请求的URLSession中访问JSON响应?

时间:2019-01-11 17:06:44

标签: json swift http-post jwt

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

我已经尝试研究如何执行此操作,但是由于我是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'

1 个答案:

答案 0 :(得分:0)

您提出的请求是异步的。所以当你跑线...

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()
}

输出:

  

Optional([[“ id”:1,“ title”:delectus autem,“ completed”:0,“ userId”:1])无

我还建议您使用Codable来解析和映射JSON响应。 Here is an intro可以使用Codable,但是有关该主题的在线资源很多。