【发布时间】:2021-10-02 19:26:21
【问题描述】:
我正在尝试发出 http 获取请求,我想返回将在 JSON 中获得的数据转换为 Array 并将其作为参数从 routes.swift 文件发送到 leaf 模板,所有这一切都使用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
}
【问题讨论】:
-
错误是具体的,你需要指定
from参数,我相信在你的代码中是data变量。let json = JSONDecoder().decode(Todos.self, from: data)。此外,您还必须更改您的代码,dataTask是异步的,并且您无法在它完成之前返回结果。 -
.decode()有两个参数:要解码的类型和要解码的数据。您需要将其设为let json = JSONDecoder().decode(Todos.self, from: <data goes here>),其中您要查找的数据似乎是dataString,但它不会存在于if-let的范围之外,因此您还需要移动解码行进入关闭状态。