如何将URLSession中的嵌套原始JSON发送到Vapor API?

问题描述 投票:-1回答:1

我有一个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,还是需要更改我的逻辑以便它可以接收平面数组?

json swift vapor urlsession
1个回答
0
投票
经过数小时的调试并遇到了奇怪的错误,我意识到我的错误比我想象的要简单。错误是:

{"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上起作用的原因。
© www.soinside.com 2019 - 2024. All rights reserved.