#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 неверно, и вы не отправляете какие-либо параметры в серверную часть, и поскольку ошибка указывает, что значение отсутствует, попробуйте без принудительной защиты развернуть его (в целях отладки), и приложение выйдет из строя, и вы получите сообщение об ошибкечто не так в этой части.