#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)