问题描述
我正在尝试发出 http get 请求,我想返回将在 JSON
中获得的数据转换为 Array
并将其作为参数发送到 leaf
模板从 routes.swift
文件中,所有这些都使用 Vapor
框架,但我收到以下错误:
Error: missing argument for parameter 'from' in call
let json = JSONDecoder().decode(Todos.self).
这是我的代码:
app.get("datos") {req -> EventLoopFuture<View> in
let url = URL(string: "https://jsonplaceholder.typicode.com/posts")
guard let requestUrl = url else { fatalError("Error url") }
var request = URLRequest(url: requestUrl)
request.httpMethod = "GET"
let task = URLSession.shared.dataTask(with: request) { (data,response,error) in
if let error = error {
print("Error took place \(error.localizedDescription)")
return
}
if let response = response as? HTTPURLResponse {
print("Response HTTP Status code: \(response.statusCode)")
}
if let data = data,let dataString = String(data: data,encoding: .utf8) {
print("Response data string:\n \(dataString)")
}
}
task.resume()
let json = JSONDecoder().decode(Todos.self)
return req.view.render("objetos",json)
}
struct Todos: Codable{
var userId: Int
var id: Int
var title: String
var body: String
}
解决方法
不要使用 URLSession - 它不能很好地与 Vapor 的期货集成,而且建立在 AsyncHTTPClient 之上的 Vapor 客户端的性能和集成度要高得多。然后,您可以将代码重写为:
app.get("datos") { req -> EventLoopFuture<View> in
req.client.get("https://jsonplaceholder.typicode.com/posts").flatMap { response in
let todos = try response.content.decode(Todos.self)
return req.view.render("objetos",json)
}
}