playframework-2.0 - 玩 2 多个 BodyParser

标签 playframework-2.0

如何使 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/

相关文章:

java - 如何在 Play2 scala 模板中设置所选选项?

java - 在 Java Play 中解析 JSON

forms - 如何使用 Play 正确验证表单!在斯卡拉?

java - 如何将可重用的代码块制作成 View 助手?

java - Swagger UI 和 Play 路由 *path

java - 在 Play! 中呈现表单时添加附加信息! 2.0.2

playframework - 将参数传递给 main.scala.html

rest - 使用 Play 2.1 作为后端构建 AngularJS 客户端代码的好方法

JSON 到 Map[String,JsObject] 与 Play 2.0?

scala - Play Framework 2.3 中的域路由