获得 401 尝试从 URLSession 请求登录

Got 401 to try request login from 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。因为我发了一个body格式的json。

进入loginUser方法添加这一行

request.setValue("Application/json", forHTTPHeaderField: "Content-Type")