Возникли проблемы с быстрым запросом POST для токена

#json #swift #api #post #networking

#json #swift #API #Публикация #сеть

Вопрос:

Итак, я пытаюсь выполнить быстрый и грязный post-запрос, чтобы получить токен, но я продолжаю получать эту ошибку. Все, что я хочу сделать прямо сейчас, это распечатать JSON, чтобы я знал, что могу хотя бы протестировать приложение.

     <NSHTTPURLResponse: 0x600002990600> { URL: https://development-290808.ew.r.appspot.com/token } { Status Code: 422, Headers {
    "Alt-Svc" =     (
        "h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43""
    );
    "Content-Length" =     (
        172
    );
    "Content-Type" =     (
        "application/json"
    );
    Date =     (
        "Wed, 16 Dec 2020 00:10:14 GMT"
    );
    Server =     (
        "Google Frontend"
    );
    "x-cloud-trace-context" =     (
        "a71f62144e6ce9a6c7046d700a6bad7a;o=1"
    );
} }
{
    detail =     (
                {
            loc =             (
                body,
                username
            );
            msg = "field required";
            type = "value_error.missing";
        },
                {
            loc =             (
                body,
                password
            );
            msg = "field required";
            type = "value_error.missing";
        }
    );
}
 

С помощью этого кода

 func getToken() {
    
    let parameters = ["username" : "Zach", "password" : "Password"]
    guard let url = URL(string: "https://development-290808.ew.r.appspot.com/token") else { return }
    
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    guard let httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: []) else {
        return }
    request.httpBody = httpBody
    
    let session = URLSession.shared
    session.dataTask(with: request) { (data, response, error) in
        if let response = response {
            print(response)
        }
        
        if let data = data {
            do {
                let json = try JSONSerialization.jsonObject(with: data, options: [])
                print(json)
            } catch {
                print(error)
                
            }
            
        }
        
    }.resume()
    
}
 

}

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

Комментарии:

1. Ну, причина: ваш код «быстрый и грязный»;) Итак, улучшите это. Используйте правильную обработку ошибок. Код должен переходить к следующему оператору только в том случае, если выполнены ВСЕ предварительные условия. Тогда, возможно, вашему серверу не нравится application / json, возможно, он ожидает конкретный JSON, который вы не отправляли. Посмотрите документы. 😉 Код состояния 422 указывает, что он может принимать application / json, но ваш JSON может быть не совсем тем, что он хочет.

Ответ №1:

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

Ответ №2:

Вы используете инструкцию guard для тела http, и она не завершается сбоем, но это тело http неверно, и вы не отправляете какие-либо параметры в серверную часть, и поскольку ошибка указывает, что значение отсутствует, попробуйте без принудительной защиты развернуть его (в целях отладки), и приложение выйдет из строя, и вы получите сообщение об ошибкечто не так в этой части.