简体   繁体   中英

How can I fetch a json file using Vapor for my leaf template to show the data?

I have a JSON hosted somewhere and I want to fetch the content, put it in a context for my leaf template to read.

However, I cannot make it work. I get the code to compile, but I get an error in the localhost

{"error":true,"reason":"Unsupported Media Type"}

Can somebody help me please. Happy holidays for all.

struct WebsiteController: RouteCollection {
    
    func boot(routes: RoutesBuilder) throws {
        
        routes.get(use: indexHandler)
        
    }
    
    
    func indexHandler(_ req: Request) -> EventLoopFuture<View> {
        return req.client.get("https://streeteasydaily.s3.us-west-2.amazonaws.com/streeteasy1.json").flatMap { res in
            do {
                
                let json = try res.content.decode([Listing].self)
                
                print(json[0].photos[0])
                let context = IndexContext(title: "Homepage", listings: json)
                return try req.view.render("index", context)
            } catch {
                // Handle error
                print("cayo en error")
                return req.eventLoop.makeFailedFuture(error)
            }
        }
        
    }
    
}


struct IndexContext: Encodable {
    let title: String
    let listings: [Listing]
}

Model

final class Listing: Model {
    static let schema = "listings" //basically the table name
    
    @ID
    var id: UUID?
    
    @Field(key: "address")
    var address: String
    
    @Field(key: "description")
    var description: String
    
    @Field(key: "photos")
    var photos: [String]
    
    init() {}
    
    //to initialize the db
    init(id: UUID? = nil, address: String, description: String, photos: [String]) {
        self.id = id
        self.address = address
        self.description = description
        self.photos = photos
    }
    

}

//to make acronym conform to CONTENT, and use it in Vapor
extension Listing: Content {}

This error is because the decode is failing to identify all the fields in your JSON to match against those defined in Listing and/or the array of such objects. The filenames must match those in the JSON exactly - ie case-sensitive and every field in the structure/model must exist in the JSON. Additional fields in the JSON that are not needed/included in the structure/model are fine.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM