Как получить доступ к ответу JSON в URLSession запроса HTTP Post? - PullRequest
0 голосов
/ 11 января 2019

Я делаю запрос http post в рамках XCTest в XCode для простого теста пользовательского интерфейса для моего приложения. В рамках запроса ответ возвращается. Я не могу получить доступ к этому ответу вне задачи 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 голосов
/ 11 января 2019

Запрос, который вы делаете, асинхронный. Поэтому, когда вы запускаете линию ...

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, "complete": 0, "userId": 1]) nil

Я бы также предложил использовать Codable для анализа и отображения ответа JSON. Вот введение к использованию Codable, но в Интернете доступно множество ресурсов по этой теме.

...