Jersey: พิมพ์คำขอจริง


88

ฉันจะดูคำขอจริงที่ Jersey สร้างและส่งไปยังเซิร์ฟเวอร์ได้อย่างไร? ฉันมีปัญหากับคำขอหนึ่ง ๆ และเพื่อนที่ใช้งานเว็บเซิร์ฟเวอร์ขอให้ดูคำขอฉบับเต็ม (พร้อมส่วนหัวและส่วนดังกล่าว)


3
สำหรับการเข้าสู่ระบบที่ฝั่งเซิร์ฟเวอร์โปรดดูโพสต์ต่อไปนี้: [วิธีรับล็อกเจอร์ซีที่เซิร์ฟเวอร์] [1] [1]: stackoverflow.com/questions/2332515/…
eeezyy

คำตอบ:


100

หากคุณเพิ่งใช้ Jersey Client API 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 (ตัวกรองคอนเทนเนอร์)


5
addFilterวิธีนี้ไม่มีใน Jersey 2.x ตอนนี้ใช้ยังไง?
Daniel Kaplan

2
JAX-RS 2.x มีฟังก์ชันการทำงานที่เทียบเท่ากับ API ไคลเอนต์ที่เป็นกรรมสิทธิ์ของ Jersey 1.x รายละเอียดเพิ่มเติม: jersey.java.net/documentation/latest/…
ivan.cikic

สำหรับผู้ที่สนใจปรับแต่ง LoggingFilter stackoverflow.com/questions/30187514/…
nacho4d

55

ตั้งแต่เจอร์ซีย์ 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บอกว่าคำขอ "และ / หรือ" การตอบกลับถูกบันทึกไว้ฮ่า ๆ ในเครื่องของฉันทั้งสองระบบถูกบันทึกไว้


วิธีนี้ใช้งานได้ดีสำหรับ Jersey 2.25 แต่ใน 2.7 ที่ฉันใช้แพ็คเกจ "การบันทึก" จะไม่อยู่ใน org.glassfish.jersey.core: jersey-common อีกต่อไป คุณรู้หรือไม่ว่าแพ็คเกจใดถูกย้ายไปที่ 2.7?
ทิม

สิ่งนี้ไม่ได้พิมพ์เนื้อหาของคำขอหรือการตอบกลับ แสดงเฉพาะส่วนหัวเท่านั้น
David Brossard

2
@DavidBrossard ใช้ org.glassfish.jersey.logging.LoggingFeature.Verbosity.PAYLOAD_ANY เป็นพารามิเตอร์ตัวสร้างเพื่อควบคุมสิ่งนี้
AxelW

51

คำตอบของ @ ivan.cikic คือ Jersey 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 มันจะดีกว่าถ้ามันให้ฉันควบคุมคนตัดไม้ได้ ดูเหมือนว่าจะก้าวถอยหลังในการออกแบบ


3
ฉันรู้ว่านี่เป็นคำตอบเก่า แต่ฉันมีคำถาม - คุณรู้วิธีให้คนตัดไม้พิมพ์ข้อมูลทั้งหมดที่มีอยู่ในคำขอได้อย่างไร โดยเฉพาะคุกกี้ ฉันเคยใช้ตัวLoggingFilter(Logger logger, boolean PrintEntity)สร้าง แต่มันก็ไม่ได้พิมพ์คุกกี้
bkaiser

2
LoggingFilter เลิกใช้งานแล้ว คุณควรใช้คำตอบของ Martin ใน LoggingFeature นอกจากนี้ยังสนับสนุน Verbosity enum เพื่อพิมพ์รายละเอียดจำนวนที่แตกต่างกัน ควรพิมพ์ส่วนหัวซึ่งควรมีคุกกี้
Dan Hardiker

ด้วยเหตุผลบางอย่างLoggingFeatureไม่พิมพ์อะไรเลยและLoggingFilterไม่พิมพ์ ... 🤷‍♂️
Ferran Maylinch

0

คำตอบทั้งหมดนี้ค่อนข้างใกล้เคียง แต่ไม่มีการตั้งค่าในการบันทึกคำขอและเนื้อหาตอบกลับ อย่างน้อยก็ด้วย 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ฉันแค่ให้ข้อมูลเหล่านี้เพื่อให้กระชับ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.