我有一个Vapor API,该API具有注册用户的途径。此路由以JSON格式接收嵌套对象,如下所示:
{
"name": "Test",
"email": "[email protected]",
"password": "Test1",
"phone": {
"numberString": "+52 999 999 9999",
"countryCode": 52,
"nationalNumber": 9999999999,
}
}
此JSON转换为内容/可编码对象:
final class Create: Codable, Content {
let name: String!
let email: String!
let password: String
let phone: PhoneNumber!
init(name: String, email: String, password: String, phone: PhoneNumber) {
self.name = name
self.email = email
self.password = password
self.phone = phone
}
}
我已经尝试过通过Postman将JSON字符串作为原始发送的路由,并且该路由运行得很好,但是问题是,当我尝试通过iOS的URLSession发送URLSession时,ErrorMiddleware抛出DecodingError:
DecodingError:键'password'所需的'String'类型的值。
[起初,我认为问题出在JSON生成,直到出于测试目的,我发送了与示例中相同的JSON,并且Vapor API仍然抛出错误。
let urlStr = "\(BaseURL)/api/student/register"
guard let url = URL(string: urlStr) else { return }
var urlRequest = URLRequest(url: url, cachePolicy:
.reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 30.0)
let raw = "{\"name\":\"Prueba\",\"email\":\"[email protected]\",\"password\":\"Prueba1\",\"phone\":{\"numberString\":\"+52 999 271 5671\",\"countryCode\":52,\"nationalNumber\":9992715671}}"
urlRequest.httpMethod = "POST"
urlRequest.httpBody = raw.data(using: .utf8)
urlRequest.addValue("application/json", forHTTPHeaderField: "Accept")
URLSession.shared.dataTask(with: urlRequest) { (data, response, error) in
...
}.resume()
您甚至可以通过URLSession发送这种类型的JSON,还是需要更改我的逻辑以便它可以接收平面数组?
{"error":true, "reason":"Value of type 'String' required for key 'password'."}
[我试图向邮递员发送请求,但没有返回的密钥'密码':
{"error": true, "reason": "Value required for key 'password'."}
是什么让我分析了我的对象,然后我看到了错误,我的Create对象没有正确展开,更确切地说是:
let password: String
应该像这样在旁边有一个!。String
let password: String!
目前尚不清楚为什么在Postman而不是URLSession上起作用的原因。