Đọc nội dung phản hồi trong ứng dụng khách JAX-RS từ một yêu cầu đăng


75

Có một số loại proxy giữa ứng dụng dành cho thiết bị di động và dịch vụ web, chúng tôi phân vân trước phản hồi khi đưa ra yêu cầu đăng bài. Chúng tôi nhận được phản hồi với trạng thái 200: OK. Nhưng chúng tôi không thể tìm / trích xuất phần thân phản hồi JSON.

    Client client = ClientBuilder.newClient();
    WebTarget webTarget = client.target(WEBSERVICE_BASE_LOCATION + "mobileDevices?operatorCode=KPNSCP");
    String jsonString = "{\"osVersion\":\"4.1\",\"apiLevel\":16,\"devicePlatform\":\"ANDROID\"}";
    Builder builder = webTarget.request();
    Response response = builder.post(Entity.json(jsonString));

Chúng tôi đang sử dụng JAX-RS. Ai đó có thể vui lòng cung cấp một số gợi ý để trích xuất phần thân JSON ( String) từ phản hồi của máy chủ không?


4
Chúng tôi đã phải thay đổi nó thành: String output = response.readEntity(String.class);Để làm cho nó hoạt động. Cảm ơn rất nhiều!
user2657714

Câu trả lời:


169

Thử cái này:

String output = response.getEntity(String.class);

BIÊN TẬP

Cảm ơn @Martin Spamer đã đề cập rằng nó sẽ chỉ hoạt động cho các lọ Jersey 1.x. Để sử dụng Jersey 2.x

String output = response.readEntity(String.class);

46
Điều này sẽ chỉ hoạt động với Jax 1.x, từ Jersey: 2.x trở đi mà OP đang sử dụng (Chúng ta có thể biết từ việc sử dụng ClientBuilder.newClient ();) của anh ấy. Câu trả lời làresponse.readEntity(String.class);
Martin Spamer

3
Điều này không hoạt động đối với jaxrs-ri-2.16, ở đây bạn nhận được org.glassfish.jersey.client.HttpUrlConnector$2@1255b1d1đầu ra.
col.panic

cảm ơn, tôi đã mắc kẹt vào vấn đề này trong một thời gian dài vì tôi đang sử dụng getEntity () để đọc nội dung thông báo phản hồi. getEntity () chỉ hoạt động với Jersey 1.x và Jersey 2.0 có hỗ trợ response.readEntity () để nhận nội dung thông báo phản hồi.
Spectre007

Lưu ý rằng nếu bạn nhận được com.owlike.genson.stream.JsonStreamException: Readen value can not be converted to String, bạn sẽ cần đọc luồng phản hồi theo cách thủ công để nhận Chuỗi JSON. Điều đó đã xảy ra với tôi với Jersey 1.19.
dvlcube

17

Tôi vừa tìm thấy một giải pháp cho jaxrs-ri-2.16 - chỉ cần sử dụng

String output = response.readEntity(String.class)

điều này mang lại nội dung như mong đợi.


14
Các nhà phát triển Jersey khiến tôi phát điên. Mọi phương pháp đặt tên phiên bản và / hoặc toàn bộ quy trình làm việc đều thay đổi đáng kể. Nó giống như chơi trò chơi Miner. Tìm tất cả các mỏ từ đầu.
Alfishe

2
Bạn không thích Nhanh nhẹn? :)
Whimusical

8
@Whimusical Tôi nghĩ anh ấy thích khả năng tương thích ngược :)
Hristo Vrigazov

13

Đối với trường hợp sử dụng của tôi, không có câu trả lời nào trước đây hoạt động bởi vì tôi đang viết bài kiểm tra đơn vị phía máy chủ không thành công do thông báo lỗi sau như được mô tả trong câu hỏi Đối tượng phản hồi khách hàng không thể giả mạo Glassfish Jersey :

java.lang.IllegalStateException: Method not supported on an outbound message.
at org.glassfish.jersey.message.internal.OutboundJaxrsResponse.readEntity(OutboundJaxrsResponse.java:145)
at ...

Ngoại lệ này xảy ra trên dòng mã sau:

String actJsonBody = actResponse.readEntity(String.class);

Cách khắc phục là chuyển dòng mã có vấn đề thành:

String actJsonBody = (String) actResponse.getEntity();

3
getEntity sẽ không tự động đọc bất kỳ InputStream hỗ trợ nào, vì vậy hãy cẩn thận.
Ben

4

Tôi cũng gặp vấn đề tương tự, cố gắng chạy mã gọi kiểm tra đơn vị sử dụng readEntity. Không thể sử dụng getEntitytrong mã sản xuất vì điều đó chỉ trả về a ByteInputStreamchứ không phải nội dung của phần nội dung và không có cách nào tôi thêm mã sản xuất chỉ được đánh trong các thử nghiệm đơn vị.

Giải pháp của tôi là tạo một phản hồi và sau đó sử dụng gián điệp Mockito để chế nhạo readEntityphương pháp:

Response error = Response.serverError().build();
Response mockResponse = spy(error);
doReturn("{jsonbody}").when(mockResponse).readEntity(String.class);

Lưu ý rằng bạn không thể sử dụng when(mockResponse.readEntity(String.class)tùy chọn này vì tùy chọn đó sẽ giống nhau IllegalStateException.

Hi vọng điêu nay co ich!


1
Cảm ơn bạn! Bạn có lẽ là người đầu tiên thực sự hiểu câu hỏi của OP. Đối với tất cả các bạn, những người trả lời đầu tiên khác: không ai quan tâm đến việc bạn thông minh đến mức nào. Họ muốn sửa chữa vấn đề của họ. Họ không quan tâm đến việc tại sao jersey không cho phép bạn gọi readResponse trong bài kiểm tra đơn vị.
John Calcote

0

Ghi lại với tài liệu, phương thức getEntity trong Jax rs 2.0 trả về một Dòng đầu vào. Nếu bạn cần chuyển đổi InputStream thành Chuỗi với định dạng JSON, bạn cần truyền hai định dạng. Ví dụ trong trường hợp của tôi, tôi đã triển khai phương pháp tiếp theo:

    private String processResponse(Response response) {
    if (response.getEntity() != null) {
        try {
            InputStream salida = (InputStream) response.getEntity();
            StringWriter writer = new StringWriter();
            IOUtils.copy(salida, writer, "UTF-8");
            return writer.toString();
        } catch (IOException ex) {
            LOG.log(Level.SEVERE, null, ex);
        }
    }
    return null;
}

tại sao tôi thực hiện phương pháp này. Bởi vì đọc trên các blog khác nhau rằng nhiều nhà phát triển họ có cùng vấn đề với phiên bản trong jaxrs bằng cách sử dụng các phương pháp tiếp theo

String output = response.readEntity(String.class)

String output = response.getEntity(String.class)

Tác phẩm đầu tiên sử dụng jersey-client từ thư viện com.sun.jersey và tác phẩm thứ hai sử dụng jersey-client từ org.glassfish.jersey.core.

Đây là lỗi đã được trình bày cho tôi: org.glassfish.jersey.client.internal.HttpUrlConnector $ 2 không thể truyền sang java.lang.String

Tôi sử dụng phụ thuộc maven sau:

<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.28</version>

Điều tôi không biết là tại sao phương thức readEntity không hoạt động, tôi hy vọng bạn có thể sử dụng giải pháp.

Carlos Cepeda


0

Nhận ra việc sửa đổi mã, tôi đã tìm ra nguyên nhân tại sao phương pháp đọc không hoạt động với tôi. Vấn đề là một trong những phụ thuộc mà dự án của tôi sử dụng jersey 1.x. Cập nhật phiên bản, điều chỉnh máy khách và nó hoạt động.

Tôi sử dụng phụ thuộc maven sau:

<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.28</version>

Trân trọng

Carlos Cepeda

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.