ฉันจะดูคำขอจริงที่ Jersey สร้างและส่งไปยังเซิร์ฟเวอร์ได้อย่างไร? ฉันมีปัญหากับคำขอหนึ่ง ๆ และเพื่อนที่ใช้งานเว็บเซิร์ฟเวอร์ขอให้ดูคำขอฉบับเต็ม (พร้อมส่วนหัวและส่วนดังกล่าว)
ฉันจะดูคำขอจริงที่ Jersey สร้างและส่งไปยังเซิร์ฟเวอร์ได้อย่างไร? ฉันมีปัญหากับคำขอหนึ่ง ๆ และเพื่อนที่ใช้งานเว็บเซิร์ฟเวอร์ขอให้ดูคำขอฉบับเต็ม (พร้อมส่วนหัวและส่วนดังกล่าว)
คำตอบ:
หากคุณเพิ่งใช้ 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 (ตัวกรองคอนเทนเนอร์)
addFilter
วิธีนี้ไม่มีใน Jersey 2.x ตอนนี้ใช้ยังไง?
ตั้งแต่เจอร์ซีย์ 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
บอกว่าคำขอ "และ / หรือ" การตอบกลับถูกบันทึกไว้ฮ่า ๆ ในเครื่องของฉันทั้งสองระบบถูกบันทึกไว้
คำตอบของ @ 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 มันจะดีกว่าถ้ามันให้ฉันควบคุมคนตัดไม้ได้ ดูเหมือนว่าจะก้าวถอยหลังในการออกแบบ
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
ฉันแค่ให้ข้อมูลเหล่านี้เพื่อให้กระชับ