Làm cách nào tôi có thể xem yêu cầu thực tế mà Jersey tạo và gửi đến máy chủ? Tôi đang gặp sự cố với một yêu cầu cụ thể và đồng nghiệp đang chạy máy chủ web đã yêu cầu xem toàn bộ yêu cầu (với tiêu đề và những thứ tương tự).
Làm cách nào tôi có thể xem yêu cầu thực tế mà Jersey tạo và gửi đến máy chủ? Tôi đang gặp sự cố với một yêu cầu cụ thể và đồng nghiệp đang chạy máy chủ web đã yêu cầu xem toàn bộ yêu cầu (với tiêu đề và những thứ tương tự).
Câu trả lời:
Nếu bạn chỉ đang sử dụng Jersey Client API, LoggingFilter (bộ lọc ứng dụng khách) sẽ giúp bạn:
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);
Nếu không, bạn có thể ghi lại cả yêu cầu và phản hồi trên máy chủ bằng LoggingFilter (bộ lọc vùng chứa) khác.
addFilter
phương pháp không tồn tại trong Jersey 2.x. Làm thế nào để bạn sử dụng cái này bây giờ?
Kể từ Jersey 2.23 , LoggingFeature
bạn có thể sử dụng. Sau đây là một ví dụ đơn giản hơn một chút, xin lưu ý rằng bạn cũng có thể đăng ký tính năng này 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 of LoggingFeature
nói rằng yêu cầu "và / hoặc" phản hồi được ghi lại lol. Trên máy tính của tôi, cả hai đều được đăng nhập.
Câu trả lời của @ ivan.cikic dành cho Jersey 1.x. Đây là cách bạn thực hiện trong 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());
Điều này không liên quan nhưng tôi chỉ phải phàn nàn: Cái mới LoggingFilter
thực sự gây khó chịu vì nó buộc bạn phải sử dụng Java Util Logging. Sẽ tốt hơn nếu nó cho tôi quyền kiểm soát bộ ghi nhật ký. Có vẻ như là một bước lùi trong thiết kế.
LoggingFilter(Logger logger, boolean PrintEntity)
tạo, nhưng thậm chí nó không in cookie.
LoggingFeature
không in được gì và LoggingFilter
không in được ... 🤷♂️
Tất cả các câu trả lời này khá gần nhau nhưng chúng thiếu cài đặt để ghi lại nội dung yêu cầu và phản hồi. Ít nhất với Jersey 2.30.1, đây là cách tôi hoàn thành việc ghi nhật ký yêu cầu và phản hồi bao gồm các cơ quan tương ứng của chúng:
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();
Về mặt kỹ thuật Level.All
, 8192
giá trị và có thể là null
. Tôi chỉ cung cấp chúng ở đây để ngắn gọn.