Невозможно сделать запрос POST, который вставляет tokenID в поле request_token - PullRequest
0 голосов
/ 01 мая 2020

Я получаю ту же ошибку:

{"status_code": 6, "status_message": "Недопустимый идентификатор: недопустимый идентификатор предварительный реквизит или не найден."}

Смысл кода в том, чтобы получить идентификатор токена и затем использовать этот идентификатор токена для создания идентификатора сеанса, но всякий раз, когда я делаю вызов, он возвращает эту ошибку.

struct Post: Encodable {
    let requestToken: String

    enum CodingKeys: String, CodingKey {
        case requestToken = "request_token"
    }
}

struct Response: Codable {
    let success: Bool
    let sessionId: String

    enum CodingKeys: String, CodingKey {
        case success
        case sessionId = "session_id"
        }
    }

struct ResponseToken: Codable {
var success: Bool
var expires: String
var requestToken: String

enum CodingKeys: String, CodingKey {
    case success
    case expires = "expires_at"
    case requestToken = "request_token"
        }
    }

struct ErrorHandler: Codable {
    var status: String
    var statusCode: Int

    enum CodingKeys: String, CodingKey {
        case status = "status_message"
        case statusCode = "status_code"
    }
}


let apiKey = ""
let Testurl = URL(string: "https://api.themoviedb.org/3/authentication/session/new?api_key=\(apiKey)")!
let getToken = URL(string: "https://api.themoviedb.org/3/authentication/token/new?api_key=\(apiKey)")!
var sessionID = ""
var tokenID = ""

func taskPOSTRequest<RequestType: Encodable, ResponseType: Decodable>(url: URL, body: RequestType, response: ResponseType.Type, completionHandler: @escaping (ResponseType?, Error?) -> Void) {

       var request = URLRequest(url: url)
       request.httpMethod = "POST"
       request.addValue("application/json", forHTTPHeaderField: "Content-Type")
       request.httpBody =  try! JSONEncoder().encode(body)

       let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
           guard let data = data else {
               completionHandler(nil,error)
               return
           }
        print(String(data: data, encoding: .utf8)!)
           let decoder = JSONDecoder()

           do {
               let responseObject = try decoder.decode(ResponseType.self, from: data)
                   completionHandler(responseObject, nil)
           } catch {
                    completionHandler(nil, error)
        }
       }
       task.resume()
   }
func taskGETRequest<ResponseType: Decodable>(url: URL, response: ResponseType.Type, completionHandler: @escaping (ResponseType?, Error?) -> Void ){
let task = URLSession.shared.dataTask(with: url) { data, response, error in
        guard let data = data else {
            completionHandler(nil, error)
        return
    }
        let decoder = JSONDecoder()
        do {
            let responseObject = try decoder.decode(ResponseType.self, from: data)
                completionHandler(responseObject, nil)

        } catch {
            completionHandler(nil, error)
        }
    }
    task.resume()
}
taskGETRequest(url: getToken, response: ResponseToken.self) { (response, error) in
    if let response = response {
        tokenID = response.requestToken
        print(tokenID)
    } else {
        print(error!)
    }
}

taskPOSTRequest(url: Testurl, body: Post(requestToken: tokenID), response: Response.self) { (response, error) in
    if let response = response{
         sessionID = response.sessionId
           print(sessionID)
    } else {
        print(error!)
    }
}

Я продолжаю получать ту же ошибку:

{"status_code": 6, "status_message": "Недопустимый идентификатор: недопустимый идентификатор обязательного или не найден."}

1 Ответ

0 голосов
/ 01 мая 2020

Это потому, что два запроса зависят друг от друга, и оба они являются асинхронными.

В вашем примере ответ API A необходим в запросе API B. Таким образом, следующее должно помочь ... когда мы ждем завершения первого запроса, как только у нас есть токен, мы выполняем второй запрос.

Таким образом, getToken API сгенерирует токен, а затем использует токен для создания сеанса. :)

taskGETRequest(url: getToken, response: ResponseToken.self) { (response, error) in
    if let response = response {
        tokenID = response.requestToken
        print(tokenID)

        taskPOSTRequest(url: Testurl, body: Post(requestToken: tokenID), response: Response.self) { (response, error) in
            if let response = response{
                sessionID = response.sessionId
                print(sessionID)
            } else {
                print(error!)
            }
        }

    } else {
        print(error!)
    }
}
...