Swift 构造为请求正文

Swift Struct as Request Body

正在尝试使用 Vapor 和 Swift 将数据发送到我的 postgreSQL 数据库。

这是示例代码(Swift 构造为请求主体)

struct ToDoResponseModel: Codable {
   var id: Int
   var Name: String
   var isComplete: Bool
}

let url = URL(string: "http://localhost:8080/todos")
guard let requestUrl = url else { fatalError() }
var request = URLRequest(url: requestUrl)
request.httpMethod = "POST"

// Set HTTP Request Header
request.setValue("application/json", forHTTPHeaderField: "Accept")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")

let newTodoItem = ToDoResponseModel(id: 300, Name: "Urgent task 2", isComplete: true)

do {
    let jsonData = try JSONEncoder().encode(newTodoItem)
    request.httpBody = jsonData
}catch let jsonErr{
    print(jsonErr)
}

let task = URLSession.shared.dataTask(with: request) { (data, response, error) in

    if let error = error {
        print("Error took place \(error)")
        return
    }
    guard let data = data else {return}

    do {
        let todoItemModel = try JSONDecoder().decode(ToDoResponseModel.self, from: data)
        print("Response data:\n \(todoItemModel)")
        print("todoItemModel Name: \(todoItemModel.Name)")
        print("todoItemModel id: \(todoItemModel.id )")
    } catch let jsonErr {
        print(jsonErr)
    } 
}
task.resume()

但是我遇到了下一个错误:

keyNotFound(CodingKeys(stringValue: "id", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"id\", intValue: nil) (\"id\").", underlyingError: nil))

此行修复的错误:

let todoItemModel = try JSONDecoder().decode(ToDoResponseModel.self, from: data)

Vapor 发给我:

[ ERROR ] DecodingError.keyNotFound: Value required for key 'IsComplete'. (ErrorMiddleware.swift:26)

您似乎是从客户端发送 isComplete,但 Vapor 服务器需要 IsComplete(大写 I)