使用after过滤器将响应代码修改为200 OK

时间:2019-05-22 22:53:57

标签: spark-java

我声明了路径/ api。当前有1条路线/人(获取)。到目前为止,如果我尝试获取/ api /无论那个不是人的东西,服务器都会返回404,这恰好是您期望的。 但是,我添加了一个after过滤器,现在对于不存在的路由,它系统地返回200。

删除after过滤器,它可以正常工作。重要的是要知道,尽管after修改了响应的主体,但它在修改状态方面几乎没有进展。

请参阅下面的最小可重复示例。在示例中,我只向主体添加了一个空的JSON对象,但是,在真正的应用程序中,我当然正在做其他事情,但没有修改状态代码。

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import org.slf4j.LoggerFactory;
import spark.Request;
import spark.Response;
import spark.Route;
import spark.servlet.SparkApplication;
import static spark.Spark.*;

public class Server implements SparkApplication {

    private static org.slf4j.Logger LOGGER = LoggerFactory.getLogger(Server.class);

    public static void main(String[] args) {

        new Server().init();
    }

    @Override
    public void init() {

        before("*", (request, response) -> {
            LOGGER.info("Request: " + request.url());
        });

        after((request, response) -> {
            response.type("application/json");
            response.header("Content-Encoding", "gzip");

        });

        /**
         * Let's declare routes
         */
        get("/ping", Server.ping);

        path("/api", () -> {
            //add query information to response object
            after("/*", (Request request, Response response) -> {
                Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();

                JsonObject body;
                if (response.body() != null) {
                    body = new JsonParser().parse(response.body()).getAsJsonObject();
                } else {
                    body = new JsonObject();
                }

                response.body(body.toString());
            });

            get("/person", Server.ping);
        });

    public static Route ping = (Request req, Response res) -> {
        res.status(200);
        return "Alive.";
    };
}

如果您在/ api中取消声明after过滤器,则一切正常,只有/ api / person会返回200。我希望使用该过滤器,如果路由不存在,则状态为404。

1 个答案:

答案 0 :(得分:0)

代替使用

   after("/*", (Request request, Response response) -> {
            Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();

            JsonObject body;
            if (response.body() != null) {
                body = new JsonParser().parse(response.body()).getAsJsonObject();
            } else {
                body = new JsonObject();
            }

            response.body(body.toString());
        });

在过滤器中删除通配符。

   after("/", (Request request, Response response) -> {
            Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();

            JsonObject body;
            if (response.body() != null) {
                body = new JsonParser().parse(response.body()).getAsJsonObject();
            } else {
                body = new JsonObject();
            }

            response.body(body.toString());
        });