我试图找到一个简单的例子,说明一个人如何在路由器内部向 vapor 示例端点发送请求 http://example.vapor.codes/json,接收响应并将其映射到结构或类。
我在别处看到过 Vapor 2 的示例,但它们不再与 Vapor 3 相关,并且当前的 Vapor 3 beta 文档不清楚。
有点像...
router.get("sample") { req in
//1. create client
//2. send get request to sample endpoint at http://example.vapor.codes/json
//3. handle response and map to a struct or class
}
我的目标是从端点抓取一些东西,将其转换为结构或类并将其显示在叶 View 中。
{"array":[0,1,2,3],"dict":{"lang":"Swift","name":"Vapor"},"number":123,"string":"test"}
这是我认为如何完成的大纲,但我不明白如何将响应和过程处理到结构中,以便我可以在我的 home.leaf 中使用它的 html(我不关心对于叶部分,假设我拥有所有这些的所有配置并已经导入)。
router.get("example"){ req -> Future<View> in
struct ExampleData: Codable {
var array : [Int]
var dict : [String : String]
}
return try req.make(Client.self).get("http://example.vapor.codes/json").flatMap(to: ExampleData.self) { res in
//not sure what to do to set the values of the ExampleData
}
return try req.view().render("home", ExampleData())
}
最佳答案
我强烈建议您阅读下面的解释,但这是代码。
struct ExampleData: Codable {
var array : [Int]
var dict : [String : String]
}
// Register a GET /example route
router.get("example") { req -> Future<View> in
// Fetch an HTTP Client instance
let client = try req.make(Client.self)
// Send an HTTP Request to example.vapor.codes/json over plaintext HTTP
// Returns `Future<Response>`
let response = client.get("http://example.vapor.codes/json")
// Transforms the `Future<Response>` to `Future<ExampleData>`
let exampleData = response.flatMap(to: ExampleData.self) { response in
return response.content.decode(ExampleData.self)
}
// Renders the `ExampleData` into a `View`
return try req.view().render("home", exampleData)
}
A Future<Expectation>是 Expectation 的包装器.期望可以成功或失败(出现错误)。
Future 类型可以注册在成功完成时执行的回调。我们在这里使用的回调之一是 flatMap .让我们深入了解常规 map ,首先。
如果你map a Future 你改造 future 的成功Expectation并透明地通过错误条件。
let promise = Promise<String>()
let stringFuture = promise.future // Future<String>
let intFuture = stringFuture.map(to: Int.self) { string -> Int in
struct InvalidNumericString: Error {}
guard let int = Int(string) else { throw InvalidNumericString() }
return int // Int
}
intFuture.do { int in
print("integer: ", int)
}.catch { error in
print("error: \(error)")
}
如果我们使用有效的十进制整数格式的字符串来完成 promise ,例如 "4"它会打印 integer: 4
promise.complete("4")
如果我们在其中放置任何非数字字符,例如 "abc"它会在 InvalidNumericString 中抛出错误将触发 catch 的错误 block 。
promise.complete("abc")
无论您做什么,map 都会引发错误或 flatMap函数将通过其他转换透明地级联。改造 future 将改造Expectation只有,并且只有在成功的案例中才会被触发。错误案例将从“基础 future ”复制到新改造的 future 。
如果您未完成 promise 而不是完成 promise ,map block 将永远不会被触发并且 AnyError条件将在 catch 中找到而是阻止。
struct AnyError: Error {}
promise.fail(AnyError())
flatMap与上面的例子非常相似。这是一个map尾随闭包返回 Future<Expectation>而不是 Expectation .
所以如果我们将 map block 重写为 flatMap ,虽然不切实际,但我们最终会得到这个:
let intFuture = stringFuture.flatMap(to: Int.self) { string -> Future<Int> in
struct InvalidNumericString: Error {}
guard let int = Int(string) else { throw InvalidNumericString() }
return Future(int) // Int
}
intFuture仍然是Future<Int>因为递归 future 将从 Future<Future<Int>> 展平只是Future<Int> .
response.content.decode bit 读取 Content-Type 并查找默认的 Decoder对于此内容类型。解码后的结构将作为 Future<DecodedStruct> 返回,在这种情况下,这个结构是 ExampleData .
异步返回内容的原因是因为内容可能还没有完全到达 HTTP 响应。这是一个必要的抽象,因为我们可能会收到超过 100MB 的文件,这可能会导致(云)服务器崩溃,而只有少量可用内存。
回到原来的路线:
http://example.vapor.codes/json 提出请求Future<Response> 中的内容异步Future<View> 框架会理解你正在返回一个 Future<View>并将继续处理其他请求,而不是等待结果。
一旦收到 JSON,该请求将被再次拾取并处理成您的网络浏览器将收到的响应。
Leaf 建立在 TemplateKit 之上,它将异步等待 future 。就像 Vapor 一样,Leaf 和 TemplateKit 会很好地理解 Futures,以至于您可以传递 Future 而不是结构(反之亦然),并且如果有必要,它们会切换到另一个请求,直到 future 完成。
关于swift - Vapor 3 Beta 端点请求示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48589415/
//1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json
我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby-vips的github页面上的链接,我们将不胜感激!如果有ruby-
我已经有很多两个值数组,例如下面的例子ary=[[1,2],[2,3],[1,3],[4,5],[5,6],[4,7],[7,8],[4,8]]我想把它们分组到[1,2,3],[4,5],[5,6],[4,7,8]因为意思是1和2有关系,2和3有关系,1和3有关系,所以1,2,3都有关系我如何通过ruby库或任何算法来做到这一点? 最佳答案 这是基本Bron–Kerboschalgorithm的Ruby实现:classGraphdefinitialize(edges)@edges=edgesenddeffind_maximum_
很高兴看到google代码:google-api-ruby-client项目,因为这对我来说意味着Ruby人员可以使用GoogleAPI-s来完善代码。虽然我现在很困惑,因为给出的唯一示例使用Buzz,并且根据我的实验,Google翻译(v2)api的行为必须与google-api-ruby-client中的Buzz完全不同。.我对“Explorer”演示示例很感兴趣——但据我所知,它并不是一个探索器。它所做的只是调用一个Buzz服务,然后浏览它已经知道的关于Buzz服务的事情。对我来说,Explorer应该让您“发现”所公开的服务和方法/功能,而不一定已经知道它们。我很想听听使用这个
在他们的网站上找不到任何内容。我主要只是想看看哪个值得一试(当然是RIA)。谢谢 最佳答案 SproutCoredemos 关于ruby-是否有SproutCore或Cappuccino的现场演示/示例应用程序,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1419788/
我最近尝试安装rails4.1.0.beta1,但是railss导致以下错误。[RVM]/gems/ruby-2.0.0-p247/gems/activesupport-4.1.0.beta1/lib/active_support/core_ext/module/aliasing.rb:32:in`alias_method':undefinedmethod`graft'forclass`ActiveRecord::Associations::JoinDependency'(NameError)[RVM]/gems/ruby-2.0.0-p247/gems/activesupport-4
我按照RailsTutorial.org第三版(刚刚发布的版本)中的说明安装了Rails4.2.0.beta2。我没有使用cloudIDE,而是在带有RVM的Windows7主机上通过Vagrant使用UbuntuTrusty32。rails_4.2.0.beta2_newhello_app然后粘贴到hisgemfilesample中。在那之后,我跑了:$bundleinstall$railss服务器启动正常,但是当我尝试连接到localhost:3000时,出现“找不到服务器”更奇怪的是,我还有几个其他的Rails入门项目,我一直在使用Rails4.0.3和4.1.6,我能够很好地连
我对自动测试的工作方式的印象(基于cucumbergithubwiki和其他在线内容)是它应该重新运行红色示例,直到它们通过。我的问题是它会重新运行规范文件中找到失败示例的所有示例,包括通过的示例。我不想浪费时间在修复失败示例的同时重新运行通过的示例。是否可以配置自动测试以便仅运行失败的示例? 最佳答案 您需要rspec-retrygem。以下是文档中有关如何实现它的一些示例:将它应用到覆盖整个测试套件的configureblock中...RSpec.configuredo|config|config.verbose_retry=t
我目前有一个运行在4.2.5上的Rails应用程序,我想使用ActionCable而不必将整个应用程序升级到Rails5.0.0.beta3版本并冒破坏所有其他gem的风险。按照我在互联网上看到的指南,我已经尝试过gem'actioncable',github:'rails/actioncable'这不起作用,因为ActionCable存储库已合并到Rails存储库中。我什至试过gem'actioncable',github:'rails/rails'但这似乎不适用于ActionCable合并到Rails时发生的版本重新编号。(唯一低于5.0.0.beta*的版本是0.0.0,这似乎是
我找不到任何使用Rack::Session::Cookie的简单示例,并且希望能够将信息存储在cookie中,并在以后的请求中访问它并让它过期.这些是我能找到的唯一示例:HowdoIset/getsessionvarsinaRackapp?http://rack.rubyforge.org/doc/classes/Rack/Session/Cookie.html这是我得到的:useRack::Session::Cookie,:key=>'rack.session',:domain=>'foo.com',:path=>'/',:expire_after=>2592000,:secret=