Я объявил путь / 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.