Function Update dans Vapor

Bonjour,

Je suis actuellement l’excellent cours sur Vapor.
J’ai construit un début de petit WebService tout simple pour gérer une liste de course à plusieurs. (Si je peux gagner du temps quand je vais en course avec mes enfants histoire d’avoir encore plus de temps pour coder…)
Par contre je galère un peu pour trouver une fonction dans mon appli pour mettre à jour les objets dans Vapor/Fluent. Si j’ai bien compris, il s’agit de la commande PUT.
Voici mon code:
Dans Vapor:

struct PurchaseController: RouteCollection, Content {
    func boot(routes: RoutesBuilder) throws {
        let purchases = routes.grouped("purchases")
        purchases.get(use: index)
        purchases.post(use: create)
        
        purchases.group(":purchaseID") { purchase in
            purchase.delete(use: delete)
            purchase.put(use:update)
           
        }
        purchases.delete(use:deleteAll)
            guard let id = req.parameters.get("purchaseID", as: UUID.self) else {
                throw Abort(.badRequest)
            }
            let input = try req.content.decode(Purchase.self)
            return Purchase.find(id, on: req.db)
                .unwrap(or: Abort(.notFound))
                .flatMap { purchase in
                    purchase.title = input.title
                    purchase.quantity = input.quantity
                    purchase.completed = input.completed
                    return purchase.update(on: req.db)
                        .map { Purchase(id: purchase.id, title: purchase.title, quantity: purchase.quantity, completed: purchase.completed) }
                }

Code coté appli:

func updatePurchase(purchase: Purchase) {
        let purchaseToUpdate = Purchase(id: purchase.id, title: purchase.title, quantity: purchase.quantity, completed: purchase.completed)
        guard let purchasePosted = URL(string: "http://127.0.0.1:8080/purchases") else {return}
        
        let encoder = JSONEncoder()
        var request = URLRequest(url: purchasePosted)
        request.httpMethod = "PUT"
        
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.httpBody = try? encoder.encode(purchaseToUpdate)
        
        URLSession.shared.dataTask(with: request) { (data, response, error) in
            if let data = data {
                print("data = data")
                print ("\(purchase.title) - \(purchase.quantity) - \(purchase.completed)")
                let decoder = JSONDecoder()
                if let item = try? decoder.decode(Purchase.self, from: data) {
                    print("Purchase uploaded ! \(item.title)")
                } else {
                    print("Bad JSON received back !")
                }
            }
        }.resume()
       
    }

A chaque appel de fonction, je me retrouve avec mon print(« Bad JSON received back ! ») dans la console.

Dans PAW ma fonction Update fonctionne avec le PUT!

Si quelqu’un peut me débloquer ce serait cool.
En vous remerciant d’avance.
Bien à vous.

Oups, j’avais juste oublié de passer l’id dans la requête HTTP…

 guard let purchasePosted = URL(string: "http://127.0.0.1:8080/purchases/\(purchase.id)") else {return}

Si ça peut servir…
Bonne journée

3 J'aime