I am trying to make an http get request and I want to go back to convert the data obtained in JSON
to an Array
and send it as a parameter to a leaf
template from the routes.swift
file, all this using Vapor
framework but I get the following error:
Error: missing argument for parameter 'from' in call
let json = JSONDecoder().decode(Todos.self).
Here is my code:
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
}
Don't use URLSession - it doesn't integrate nicely with Vapor's futures and Vapor's client built on top of AsyncHTTPClient is much more performant and integrated. You can then rewrite your code to look like:
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)
}
}