Search code examples
swiftvapor

error: missing argument for parameter 'from' in call


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

}


Solution

  • 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)
        }    
    }