Swift - возвращает строку в запросе POST с помощью Vapor 3 - PullRequest
1 голос
/ 20 июня 2020

У меня проблема, когда пользователю нужно разместить новый заказ через POST-запрос. Сервер должен вернуть идентификатор заказа, чтобы интерфейсный код мог проверить, был ли заказ принят. Как я могу это сделать?

Это мой код:

router.post("postNewOrder") { req -> Future<HTTPStatus> in
    print(req)
    return try req.content.decode(OrderRequest.self).map(to: HTTPStatus.self) { orderRequest in
        print("latitude: \(orderRequest.latitude), longitude:\(orderRequest.longitude)")

        let newOrder = Order()
        newOrder.latitude = orderRequest.latitude
        newOrder.longitude = orderRequest.longitude

        orders.append(newOrder)

        return "1234abcd"
    }
}

Заранее спасибо :)

1 Ответ

2 голосов
/ 20 июня 2020

Прежде всего измените тип возвращаемого значения на Future<String>

Затем, если вы не используете какие-либо базы данных, а только некоторые orders массив

router.post("postNewOrder") { req -> Future<String> in
    return try req.content.decode(OrderRequest.self).map { orderRequest in
        let newOrder = Order()
        newOrder.latitude = orderRequest.latitude
        newOrder.longitude = orderRequest.longitude
        orders.append(newOrder)
        return "\(newOrder.id)"
        // if id is String then simply
        // return newOrder.id
        // if id is UUID then this way
        // return newOrder.id.uuidString
    }
}

Или если вы используете Fluent тогда вам нужно сохранить новый заказ в базе данных

router.post("postNewOrder") { req -> Future<String> in
    return try req.content.decode(OrderRequest.self).flatMap { orderRequest in
        let newOrder = Order()
        newOrder.latitude = orderRequest.latitude
        newOrder.longitude = orderRequest.longitude
        return newOrder.create(on: req).map { newOrder in
            return "\(newOrder.requireID())"
            // if id is String then simply
            // return newOrder.id
            // if id is UUID then this way
            // return newOrder.requireID().uuidString
        }
    }
}

Вы также можете изменить тип возврата на Int или UUID в зависимости от того, какой тип вы используете для \Order.id

Также вы можете вернуть такую ​​структуру

struct NewOrderResponse: Content {
    let id: UUID // or String, Int, etc.
}
...