2013-08-06 38 views
30

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 đang bối rối trước phản hồi khi đưa ra yêu cầu đăng. 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 thấy/trích xuất nội dung phản hồi JSON.Đọc nội dung phản hồi trong ứng dụng khách JAX-RS từ yêu cầu đăng

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. Có thể ai đó vui lòng cung cấp một số gợi ý để trích xuất phần nội dung JSON (String) khỏi phản hồi của máy chủ không?

+1

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

Trả lời

82

Hãy thử điều này:

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

EDIT

Nhờ @ Martin Spamer kể rằng nó sẽ làm việc cho chỉ Jersey lọ 1.x. Đối Jersey 2.x sử dụng

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

Đ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 tôi có thể nói từ việc sử dụng ClientBuilder.newClient();). Câu trả lời là 'response.readEntity (String.class);' –

+1

Điều này không làm việc cho jaxrs-ri-2.16, ở đây bạn nhận được '' 'org.glassfish.jersey.client.HttpUrlConnector $ 2 @ 1255b1d1''' làm đầu ra. –

+0

cảm ơn, tôi đã bị mắc kẹt vào điều này trong thời gian dài vì tôi đã sử dụng getEntity() để đọc nội dung thư trả lờ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ư trả lời. – spectre007

11

tôi chỉ 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)

này cung cấp các nội dung như mong đợi.

+10

Các nhà phát triển Jersey khiến tôi phát điên. Mọi phương pháp phiên bản đặt tê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

+1

Bạn có thích Agility không? :) – Whimusical

4

Đối với trường hợp sử dụng của tôi, không ai trong số các câu trả lời trước làm việc vì tôi đã viết một bài kiểm tra đơn vị server-side mà đã thất bại do thông báo lỗi sau như mô tả trong Unable to Mock Glassfish Jersey Client Response Object câu hỏi:

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 đây:

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

việc sửa chữa là để biến dòng vấn đề mã vào:

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

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

0

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

Giải pháp của tôi là tạo ra một phản ứng và sau đó sử dụng một điệp viên Mockito để thử ra readEntity phươ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 tùy chọn when(mockResponse.readEntity(String.class) vì đó ném cùng IllegalStateException.

Hy vọng điều này sẽ hữu ích!

Các vấn đề liên quan