Comment puis-je voir la demande réelle que Jersey génère et envoie au serveur? J'ai des problèmes avec une demande particulière et le membre exécutant le serveur Web a demandé à voir la demande complète (avec les en-têtes et autres).
Comment puis-je voir la demande réelle que Jersey génère et envoie au serveur? J'ai des problèmes avec une demande particulière et le membre exécutant le serveur Web a demandé à voir la demande complète (avec les en-têtes et autres).
Réponses:
Si vous utilisez simplement l'API client Jersey, LoggingFilter (filtre client) devrait vous aider:
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);
Sinon, vous pouvez à nouveau consigner la demande et la réponse sur le serveur à l'aide d'un autre LoggingFilter (filtre de conteneur).
addFilter
méthode n'existe pas dans Jersey 2.x. Comment l'utilisez-vous maintenant?
Depuis Jersey 2.23 , LoggingFeature
vous pouvez utiliser un fichier. Ce qui suit est un exemple un peu simplifié, veuillez noter que vous pouvez également enregistrer la fonctionnalité 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 de LoggingFeature
dit que la demande "et / ou" la réponse est enregistrée lol. Sur ma machine, les deux sont enregistrés.
La réponse de @ ivan.cikic est pour Jersey 1.x. Voici comment procéder dans 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());
Ce n'est pas pertinent mais je dois juste me plaindre: le nouveau LoggingFilter
est vraiment ennuyeux car il vous oblige à utiliser Java Util Logging. Ce serait mieux si cela me donnait le contrôle de l'enregistreur. Cela ressemble à un pas en arrière dans la conception.
LoggingFilter(Logger logger, boolean PrintEntity)
constructeur, mais même cela n'imprime pas les cookies.
LoggingFeature
n'imprime rien et LoggingFilter
imprime ... 🤷♂️
Toutes ces réponses sont assez proches, mais elles n'ont pas le paramètre pour enregistrer le corps de la demande et de la réponse. Au moins avec Jersey 2.30.1, c'est ainsi que j'accomplis la journalisation de la demande et de la réponse, y compris leurs corps respectifs:
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();
Techniquement, les valeurs Level.All
et 8192
pourraient être null
. Je les fournis ici pour être concis.