Методы вызова Wiremock

#java #wiremock

Вопрос:

Есть ли способ вызывать метод java каждый раз, когда сервер получает запрос?

 wireMockServer.stubFor(post(urlEqualTo("/testpost"))
                .willReturn(onIncomingRequest()));
 

вот так, поэтому север будет вызывать onIncomingRequest каждый раз, когда используется этот заглушка.

Комментарии:

1. Что именно onIncomingRequest() мы собираемся делать? Нужно ли WireMock что-то выполнять, или вы просто хотите, чтобы что- то произошло, когда запрос будет отправлен?

2. @agoff На самом деле я хочу сохранить тело последнего запроса и вернуть его с заглушкой типа «/getlastrequest». Единственный способ, который я нашел для этого, — переписывать этот тупиковый ответ каждый раз, когда запускается новый запрос «/testpost». Поэтому я хочу, чтобы «что-то произошло, когда запрос будет отправлен».

3. Итак, вы хотели бы сделать что-то вроде: Первый запрос /test с телом { some: "value" } , отвечает 200 и пустое тело. Второй запрос к /test телу { some: "other value" } , отвечает 200 и { some: "value" } ?

4. @agoff больше похоже на второй запрос, на /gettest который ответят 200 и {some value}

5. Таким образом, URL-адрес запроса для предыдущего запроса не обязательно будет соответствовать текущему запросу?

Ответ №1:

(Наиболее) правильный способ сделать это-реализовать a PostServeAction . Подробные сведения см. на этой странице документации и в тестовых примерах WireMock.

Ответ №2:

Вы можете добиться желаемого поведения, написав пользовательский преобразователь ответов. Преобразователь ответов запросит конечную точку администратора запросов WireMock, чтобы получить самые последние запросы, и проанализирует эти данные для формирования ответа.

Псевдокод:

 public class LastRequestBody extends ResponseTransformer {
    public String getName() {
        return "LastRequestBody";
    }

    @Override
    public Response transform(Request request, Response response, FileSource files, Parameters parameters) {
        // Set up some client
        String wmRequests = "http://127.0.0.1:8080/__admin/requests" // update to whatever your WM base url is
        OkHttpClient client = new OkHttpClient();
        String url = HttpUrl.parse().newBuilder().build().toString();
        okhttp3.Response okhttpResponse = client.newCall(okHttpRequest).execute();

        // Parse WM response into JSON
        JSONParser parser = new JSONParser();
        JSONObject responseObj = (JSONObject) parser.parse(okhttpResponse.body().string());
        JSONArray requests = (JSONArray) responseObj.get("requests");
        JSONObject mostRecentRequest = (JSONObject) requests[0];
        String mostRecentRequestBody = mostRecentRequest.get("request").get("body").toString();

        // Return response that looks like the original request/response
        return Response.Builder.like(response).but().body(mostRecentRequestBody.toJSONString()).build();
 
    }
}
 

Приведенный выше код может быть не на 100% правильным, но контур должен быть достаточно четким.

Проверьте страницу администратора WM для получения дополнительной информации о запросе для всех запросов. (Другие предположения — я использовал JSONSimple для анализа и OkHttp3 для отправки запроса в WM)