Jersey: In yêu cầu thực tế


88

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ự).


3
để đăng nhập ở phía máy chủ, hãy xem bài đăng sau: [Làm thế nào để nhận nhật ký áo ở máy chủ?] [1] [1]: stackoverflow.com/questions/2332515/…
eeezyy

Câu trả lời:


100

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.


5
Đây addFilterphươ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ờ?
Daniel Kaplan

2
JAX-RS 2.x cung cấp chức năng tương đương với API ứng dụng khách độc quyền Jersey 1.x. Thông tin chi tiết: jersey.java.net/documentation/latest/…
ivan.cikic

Đối với những người quan tâm đến việc tùy chỉnh đầu ra nhật ký, họ có thể tạo LoggingFilter stackoverflow.com/questions/30187514/…
nacho4d

55

Kể từ Jersey 2.23 , LoggingFeaturebạ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 LoggingFeaturenó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.


Điều này hoạt động tốt cho Jersey 2.25 nhưng trong 2.7 mà tôi đang sử dụng, gói "ghi nhật ký" không còn nằm trong org.glassfish.jersey.core: jersey-common. Bạn có biết nó đã được chuyển đến gói nào trong phiên bản 2.7 không?
Tim

Điều này không in nội dung của yêu cầu hoặc phản hồi. Nó chỉ cho thấy các tiêu đề
David Brossard

2
@DavidBrossard Sử dụng org.glassfish.jersey.logging.LoggingFeature.Verbosity.PAYLOAD_ANY làm tham số khởi tạo để kiểm soát điều này.
AxelW

51

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 LoggingFilterthự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ế.


3
Tôi biết đây là một câu trả lời cũ, nhưng tôi có một câu hỏi - bạn có biết cách để trình ghi nhật ký in TẤT CẢ thông tin có trong một yêu cầu không? Đặc biệt, cookie. Tôi đã sử dụng hàm LoggingFilter(Logger logger, boolean PrintEntity)tạo, nhưng thậm chí nó không in cookie.
bkaiser

2
LoggingFilter hiện không được dùng nữa. Bạn nên sử dụng câu trả lời của Martin về Tính năng ghi nhật ký. Điều này cũng hỗ trợ enum Verbosity in ra một lượng chi tiết khác nhau. Nó sẽ in ra các tiêu đề, trong đó phải bao gồm cookie.
Dan Hardiker

Vì một số lý do LoggingFeaturekhông in được gì và LoggingFilterkhông in được ... 🤷‍♂️
Ferran Maylinch

0

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, 8192giá trị và có thể là null. Tôi chỉ cung cấp chúng ở đây để ngắn gọn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.