我想知道如何使用 REST API 请求 POST。 (Swift)

I want to know how to request POST using REST API. (Swift)

我想根据下图使用 http post 接收令牌。 我把它写得像底层代码,但效果不佳。我该怎么办?

 func login() {
    
    let username = "TestID"
    let password = "TestPW"
    let loginString = "\(username):\(password)"

    guard let loginData = loginString.data(using: String.Encoding.utf8) else {
        return
    }
    let base64LoginString = loginData.base64EncodedString()
            
    let param = "id=0000&password=1234&password2=1234&grantType=password"
    let paramData = param.data(using: .utf8)
    
    var request = URLRequest(url: URL(string: "https://TestUrl.com")!)
    request.httpMethod = "POST"

    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("Basic \(base64LoginString)", forHTTPHeaderField: "Authorization")
    request.setValue(String(paramData!.count), forHTTPHeaderField: "Content-Length")
    
    request.httpBody = paramData
    
    let session = URLSession.shared
    let task = session.dataTask(with: request, completionHandler: { data, response, error -> Void in
        print(response!)
        do {
            let json = try JSONSerialization.jsonObject(with: data!) as! Dictionary<String, AnyObject>
            print(json)
        } catch {
            print("error")
        }
    })
    
    task.resume()
}

根据 API 的图像,您发送的 Authentication header 似乎正确。然而,似乎 body 数据预期为 JSON object:

{
    "id": 0000,
    "password": 1234,
    "password2": 1234,
    "gratType": "password"
}

所以你需要创建一个Codable结构:

struct LoginData: Codable {
    let id: Int
    let password: Int
    let password2: Int
    let gratType: String
}

然后将其转换为 JSON:

let loginData = LoginData(id: 0, password: 1234, password2: 1234, gratType: "password")
request.httpBody = try JSONEncoder().encode(loginData)

请注意,我根据您的示例创建了这个结构,它将 idpasswordpassword2 字段显示为数字字段(不是字符串),这有点奇怪我,我希望至少密码字段是字符串。 gratType 也可能拼写错误(应该是 grantType?)。但这是您可以稍后调整的内容。