ios - 得到 401 尝试从 URLSession 请求登录
问题描述
我有这个方法
func loginUser(for email: String, password: String, completed: @escaping (Result<LoginModel, Error>) -> Void) {
let endpoint = baseURL + "login"
guard let url = URL(string: endpoint) else {
completed(.failure(.invalidURL))
return
}
var request = URLRequest(url: url)
request.httpMethod = "POST"
let body = ["email": email, "password": password]
let jsonData = try? JSONSerialization.data(withJSONObject: body)
request.httpBody = jsonData
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if let _ = error {
completed(.failure(.unableToComplete))
return
}
guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {
completed(.failure(.unableToComplete))
return
}
guard let data = data else {
completed(.failure(.invalidData))
return
}
do {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let data = try decoder.decode(LoginModel.self, from: data)
completed(.success(data))
} catch {
completed(.failure(.invalidData))
}
}
task.resume()
}
但是我尝试登录用户(电子邮件和密码)我得到一个状态码 401,这是检查响应时的所有信息。
我称这个方法
NetworkManager.shared.loginUser(for: emailTextField.text!, password: passwordtextField.text!) { result in
switch result {
case .success(let data):
print(data)
case .failure(let error):
print(error.rawValue)
}
}
<NSHTTPURLResponse: 0x60000181ca80> { URL: https://basee-url/api/login } { Status Code: 401, Headers {
"Access-Control-Allow-Origin" = (
"*"
);
"Cache-Control" = (
"no-cache, private"
);
Connection = (
"keep-alive"
);
"Content-Type" = (
"application/json"
);
Date = (
"Mon, 21 Jun 2021 20:11:46 GMT"
);
Server = (
Apache
);
"Transfer-Encoding" = (
Identity
);
Via = (
"1.1 vegur"
);
"X-Ratelimit-Limit" = (
60
);
"X-Ratelimit-Remaining" = (
59
);
} }
这是 Postman 中执行的请求
解决方案
我把问题的解决方案留在这里。Swift 代码的问题在于请求没有设置 Application/Jason Header。因为我发送了一个json格式的正文。
IntologinUser
方法添加了这一行
request.setValue("Application/json", forHTTPHeaderField: "Content-Type")
推荐阅读
- grpc - grpc 服务器的应用程序上下文
- python - 移动应用程序的 django rest 框架中的版本控制编程
- jmeter - 100个用户同时上传文件jmeter
- mysql - 查找具有多个唯一值的列
- javascript - TypeError: test.describe is not a function when using nodejs, selenium and mocha
- android - 在关闭 android 应用程序后使用监听器
- java - 处理器内核和线程数
- javascript - java.sql.SQLSyntaxErrorException: ORA-01722: 尝试使用 jquery ajax jsp 删除检查值时无效数字
- r - Lintr - 有没有办法抑制大写的数据框列名警告?
- c++ - 如何捕获从 MFC Web 浏览器 C++ 发出的 GET/POST 请求