Использование после фильтра изменяет код ответа до 200 ОК - PullRequest
0 голосов
/ 23 мая 2019

Я объявил путь / API.В настоящее время он имеет 1 маршрут на человека (получить).До сих пор, если бы я попытался получить / api / what-that-not-person, сервер вернул бы 404, что именно то, что вы ожидаете.Тем не менее, я добавил фильтр после, и теперь он систематически возвращает 200 для маршрутов, которые не существуют.

Удаление фильтра после, он работает нормально, как и ожидалось.Важно знать, что хотя 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, все работает нормально, и только / api / person вернет 200. Я ожидаю, что с фильтром, если маршрут не существует, то статус 404.

1 Ответ

0 голосов
/ 24 мая 2019

Вместо использования

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