Swift Struct как тело запроса - PullRequest
2 голосов
/ 08 марта 2020

Попытка отправить данные в мою postgreSQL базу данных с использованием Vapor и Swift.

Вот пример кода (Swift Struct в качестве тела запроса)

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: "Нет значения, связанного с ключом CodingKeys (stringValue) : \ "id \", intValue: nil) (\ "id \"). ", underError: nil))

Исправлена ​​ошибка в этой строке:

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

и Vapor посылает мне:

[ОШИБКА] DecodingError.keyNotFound: значение, необходимое для ключа 'IsComplete'. (ErrorMiddleware.swift: 26)

1 Ответ

1 голос
/ 08 марта 2020

Похоже, вы отправляете isComplete со стороны клиента, но сервер Vapor ожидает IsComplete (заглавная I)

...