[Vapor3]ResponseとしてXMLを返す方法
[09/13, 2018] |
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
}
参考になれば幸いです。もっといいやり方ないのかなぁ〜。