如何使 Controller 的操作方法包含两个不同的bodyparser?例如,
@BodyParser.Of(BodyParser.Json.class)
@BodyParser.Of(BodyParser.FormUrlEncoded.class)
public static Result register() {
RequestBody body = request().body();
JsonNode node = body.asJson();
Map<String, String[]> map = body.asFormUrlEncoded();
if(node != null) {
return ok("Got: " + node);
} else if (map != null) {
return ok("Got: " + map);
} else {
return badRequest("Expecting application/json request body");
}
}
最佳答案
我认为它不遵守允许单一方法解析两种不同编码的约定。您基本上希望将两个 Controller 功能合而为一。我认为最好有单独的方法来处理不同的编码,就像这样
private static void sharedApplicationLogic() { }
public static Result registerJSON() {
JsonNode node = request().body().asJson();
// Parse
sharedApplicationLogic();
}
public static Result registerFD() {
Map<String,String[]> formdata = request().body().asFormUrlEncoded()
// Parse
sharedApplicationLogic();
}
然后您可以在路由文件中区分这些 Controller 方法
POST /register.json controllers.Application.registerJSON()
POST /register.formdata controllers.Application.registerFD()
(这不是很安静,但你明白了)
或者通过确定这是在 Controller 函数中。我觉得这很丑陋,但我想这就是您正在寻找的答案。诀窍是省略 @BodyParser
注释:
public static Result register() {
RequestBody body = request().body();
JsonNode node = body.asJson();
Map<String, String[]> map = body.asFormUrlEncoded();
if(node != null) {
return registerJSON(node);
} else if (map != null) {
return registerFD(map);
} else {
return badRequest("Expecting application/json request body");
}
}
据我所知,没有更好的方法可以做到这一点。可能不应该有,因为您想将两种不同的方法映射到一个方法上。
关于playframework-2.0 - 玩 2 多个 BodyParser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10830496/