播放2.3.x框架:如何拒绝所有非应用程序/ json请求

时间:2014-11-30 10:30:48

标签: java json validation playframework

在游戏2.3中,如何自动拒绝(返回BadRequest)所有不属于application / json类型的传入请求?是否有像BodyParsers一样的注释类型?

我不想添加额外的支票:

@BodyParser.Of(BodyParser.Json.class)
public static Result sendMessage() {
    JsonNode requestBody = request().body().asJson();
    if (requestBody == null) {
        return badRequest("Bad Request: Not JSON request");
    }
return ok();
}

1 个答案:

答案 0 :(得分:2)

可能最灵活的方法是创建自己的拦截器 - a.k.a. Action composition

示例RequiredJson.java(让我们将其放入新的annotations包中)

package annotations;

import com.fasterxml.jackson.databind.JsonNode;
import play.libs.F;
import play.mvc.Http;
import play.mvc.Result;

public class RequiredJson extends play.mvc.Action.Simple {
    @Override
    public F.Promise<Result> call(Http.Context ctx) throws Throwable {

        boolean hasCorrectType = ctx.request().getHeader("Content-Type") != null && ctx.request().getHeader("Content-Type").equals("application/json");
        JsonNode json = ctx.request().body().asJson();

        if (!hasCorrectType || json == null) {
            return F.Promise.<Result>pure(badRequest("I want JSON!"));
        }
        return delegate.call(ctx);
    }
}

因此,您可以将此注释用于整个控制器或仅用于选定的操作:

@With(annotations.RequiredJson.class)

结果:如果Content-Type无效,或者传入的数据不是有效的JSON,则会返回badRequest,否则会通常调用请求的操作。