如何让Play!框架提供XML响应

5
一些原因,我无法弄清楚如何让Play!提供XML响应。我也不理解文档(您可以在这里找到)。我的目标是创建一个站点地图,因此响应应为Content-Type: application/xml;。您将如何更改以下控制器以提供该Content-Type?
public static Result sitemap() {
    return ok("<message \"status\"=\"OK\">Hello Paul</message>");
}

1
你尝试过在sitemap方法中添加@BodyParser.Of(Xml.class)注解吗? - tehlexx
是的,它仍然提供"text/plain"类型的内容:/ - Crayl
2
有不同的方法可以生成XML响应,如tehlexx所提到的使用@BodyParser注释(使用response().setContentType("application/xml")设置正确的MIME类型),甚至更简单的方法是:像处理HTML页面一样使用模板。这可能是生成XML响应最快的方法。 - Jürgen Zornig
哇,太棒了。这个可行。谢谢!但是@BodyParser注释并不必要,response()。setContentType(“application/xml”)可以完成任务。非常感谢你。为什么不把你的评论放在回答中呢?这样我就可以标记它为正确答案了。 - Crayl
1个回答

13

如果您正确地将内容传递给ok()方法,Play将正确设置Content-type头部。例如,如果您返回String(如问题所示),它会将其视为text/plain。您至少有两种方法,最快的一种(但不美观)是强制内容类型,Jürgen建议将其设置为响应,但实际上Play有一个快捷方式:

public static Result sitemap() {
    return ok("<message status=\"OK\">Hello Paul</message>").as("text/xml");
}

另一方面,使用XML模板可能比使用拼接的字符串构建更好、更清晰... 只需创建XML文件:

/app/views/sitemap.scala.xml:

<message status="OK">John Doe</message>

因此,您可以像这样轻松使用它:

public static Result index() {
    return ok(views.xml.sitemap.render());
}

当然,这个文件是Common Play的模板,所以你可以将数据传递给它并在内部进行处理(例如,迭代项目列表等)。


XML模板是否会自动设置内容类型?不确定,因为JSON不是这种情况。 - i.am.michiel
是的,它会自动设置。如果您使用JsonNode,例如: return ok(Json.toJson(someObj)); 将会被设置为 application/json 等。 - biesior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接