玩2多个BodyParser

时间:2012-05-31 09:06:21

标签: playframework-2.0

如何使控制器的动作方法包含两个不同的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");
    }
}

1 个答案:

答案 0 :(得分:2)

我认为它不遵守允许单个方法解析两种不同编码的约定。您基本上需要两个控制器功能合二为一。我认为最好的方法是使用单独的方法处理不同的编码,如此

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();
}

然后,您可以在路径文件中区分这些控制器方法

POST /register.json         controllers.Application.registerJSON()
POST /register.formdata     controllers.Application.registerFD()

(这不是很好的RESTful,但你明白了)

通过确定这是在控制器功能中。我觉得这很难看,但我想这就是你要找的答案。诀窍是省略@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");
    }
}

据我所知,没有更好的方法可以做到这一点。可能不应该,因为你想将两种不同的方法映射到一个方法上。