Tomo.Log()


[Vapor3]ResponseとしてXMLを返す方法

[09/13, 2018]

日本語 / English

Vapor3でBlogなどを作っていて、ResponseとしてXMLを返したいときありますよね?
自分はsitemapをxmlとして出力したかったのですが、Leafなどのテンプレートを使うとヘッダーが自動的にHTMLになってしまったので手動でResponseを返すことにしました。

いろいろやり方はあると思いますが、その1例を書いておきます。

router.get("sitemap") { 
    req in
    return Article.query(on: req).all().flatMap(to: Response.self) {
        articles in
        let response : HTTPResponse = HTTPResponse(status: HTTPStatus.ok,
                                                   headers:["Content-Type":"application/xml"],
                                                   body: self.makeXml(articles: articles))
        
        return try req.makeResponse(http: response).encode(for: req)
    }
}

public funcにしてますが、普段はControllerの中のfuncになると思います。

public func makeXML(articles: [Article]) -> String {
    var siteURL = "https://sample.com/"
    
    var xml : String = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
    xml += "<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">"
    xml += "<url>"
    xml += "<loc>" + siteURL + "</loc>"
    xml += "<priority>1.0</priority>"
    xml += "</url>"
    
    for article in articles {
        
        xml += "<url>"
        xml += "<loc>" + article.url + "</loc>"
        
        xml += "<lastmod>" + article.lastupdatedAt + "</lastmod>"
        
        xml += "<priority>0.7</priority>"
        xml += "</url>"
    }
    
    xml += "</urlset>"

    return xml
}

参考になれば幸いです。もっといいやり方ないのかなぁ〜。