Как я могу просмотреть фактический запрос, который Джерси генерирует и отправляет на сервер? У меня проблемы с конкретным запросом, и сотрудник, работающий с веб-сервером, попросил просмотреть полный запрос (с заголовками и т. Д.).
Как я могу просмотреть фактический запрос, который Джерси генерирует и отправляет на сервер? У меня проблемы с конкретным запросом, и сотрудник, работающий с веб-сервером, попросил просмотреть полный запрос (с заголовками и т. Д.).
Ответы:
Если вы просто используете API-интерфейс Jersey Client, LoggingFilter (клиентский фильтр) должен вам помочь:
Client client = Client.create();
client.addFilter(new LoggingFilter(System.out));
WebResource webResource = client.resource("http://localhost:9998/");
ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON)
.get(ClientResponse.class);
В противном случае вы можете снова зарегистрировать и запрос, и ответ на сервере, используя другой LoggingFilter (контейнерный фильтр).
addFilter
метод не существует в Jersey 2.x. Как вы это используете сейчас?
Начиная с версии Jersey 2.23 , LoggingFeature
вы можете использовать. Ниже приведен немного упрощенный пример. Обратите внимание, что вы также можете зарегистрировать эту функцию WebTarget
.
Logger logger = Logger.getLogger(getClass().getName());
Feature feature = new LoggingFeature(logger, Level.INFO, null, null);
Client client = ClientBuilder.newBuilder()
.register(feature)
.build();
Response response = client.target("https://www.google.com")
.queryParam("q", "Hello, World!")
.request().get();
JavaDoc LoggingFeature
говорит, что запрос "и / или" ответ регистрируется lol. На моей машине зарегистрированы оба.
@ ivan.cikic отвечает для Джерси 1.x. Вот как это делается в Jersey 2.x:
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.filter.LoggingFilter;
import org.json.JSONException;
import org.json.JSONObject;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MediaType;
...
ClientConfig config = new ClientConfig();
Client client = ClientBuilder.newClient(config);
client.register(new LoggingFilter());
Это не имеет значения, но я просто должен пожаловаться: новое LoggingFilter
действительно раздражает, потому что заставляет вас использовать Java Util Logging. Было бы лучше, если бы он давал мне контроль над регистратором. Похоже на шаг назад в дизайне.
LoggingFilter(Logger logger, boolean PrintEntity)
конструктор, но даже он не печатает куки.
LoggingFeature
ничего не печатает и LoggingFilter
печатает ... 🤷♂️
Все эти ответы довольно близки, но им не хватает настройки для регистрации тела запроса и ответа. По крайней мере, с Jersey 2.30.1 я выполняю протоколирование запроса и ответа, включая их соответствующие тела:
import javax.ws.rs.client.ClientBuilder;
import org.glassfish.jersey.logging.LoggingFeature;
import java.util.logging.Level;
import java.util.logging.Logger;
Logger logger = Logger.getLogger("LoggingFeature");
logger.setLevel(Level.ALL);
ClientBuilder.newClient()
.target("https://www.example.com")
.register(new LoggingFeature(
logger,
Level.ALL,
LoggingFeature.Verbosity.PAYLOAD_ANY,
8192))
.request()
.get();
С технической точки зрения Level.All
и 8192
ценности могли быть null
. Я просто привожу их здесь для краткости.