Future in let-6ren">
gpt4 book ai didi

swift - Vapor:使用参数在路由器 POST 调用中调用 REST API

转载 作者:可可西里 更新时间:2023-11-01 01:06:57 25 4
gpt4 key购买 nike

所以我正在尝试在我的 Vapor 端点之一中调用第二个端点。我有一个端点,它只是一个 get 并且运行良好:

router.get("status") { req -> Future<ConnectionResponse> in
let client = try req.make(Client.self)
let response = client.get("https://url.com/endpoint/")

return response.flatMap(to: ConnectionResponse.self, { response in
return try response.content.decode(ConnectionResponse.self)
})
}

这会正确返回一个 ConnectionResponse json。当我尝试做同样的事情时,但在需要一些参数的 POST 中,我无法弄清楚为什么编译器不让我运行:

router.post("purchase") { req -> Future<ConnectionResponse> in
return try req.content.decode(PurchaseRequest.self).map(to: ConnectionResponse.self, { response in
let client = try req.make(Client.self)
let response = client.get("https://url.com/endpoint/")

return response.flatMap(to: ConnectionResponse.self, { response in
return try response.content.decode(ConnectionResponse.self)
})
})
}

它在 flatMap 上失败了说Cannot convert return expression of type 'EventLoopFuture<ConnectionResponse>' to return type 'ConnectionResponse' .

如您所见,purchase GET 调用与 status 相同除了 POST 参数的初始解码。我究竟做错了什么?

最佳答案

简单替换

return try req.content.decode(PurchaseRequest.self).map(to: ConnectionResponse.self, { response in

return try req.content.decode(PurchaseRequest.self).flatMap(to: ConnectionResponse.self, { response in

完整的工作代码可能是这样的

router.post("purchase") { req -> Future<ConnectionResponse> in
return try req.content.decode(PurchaseRequest.self).flatMap { response in
let client = try req.make(Client.self)
let response = client.get("https://url.com/endpoint/")

return response.flatMap { response in
return try response.content.decode(ConnectionResponse.self)
}
}
}

那么map之间有什么区别呢?和 flatMap

flatMap如果下一个结果是 Future<Something> 则使用例如:

someDatabaseCall(on: container).flatMap { databaseResult1 in
/// it will return Future<DatabaseResult>
/// that's why we use `flatMap` above instead of `map`
return anotherDatabaseCall(on: container)
}

map用于非 future 结果,例如:

someDatabaseCall(on: container).map { databaseResult1 in
/// it will return non-future result
/// that's we use `map` above instead of `flatMap`
return "hello world" // just simple string
}

什么是 Future<> ?这只是一个 promise ,就像一个带有回调的对象。

关于swift - Vapor:使用参数在路由器 POST 调用中调用 REST API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57449948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com