2012-07-08 25 views
11

Tôi có 2 câu hỏi:REST. Jersey. Làm thế nào để lập trình chọn kiểu trả về: JSON hoặc XML?

1. Tôi có thể tạo một lớp, chú thích nó với JAXB chú thích (hỗ trợ XML) và tuyên bố trong web.xml

<init-param> 
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
    <param-value>true</param-value> 
</init-param> 

cho JSON (thư viện Jackson) ủng hộ? Hoặc tôi cần phải tạo riêng hai lớp cho JSON và XML?

Hoặc có thể tồn tại một số cách thanh lịch hơn để làm cho dịch vụ REST trả về cả JSON và XML?

2. Làm cách nào tôi có thể chọn kiểu trả về (JSON hoặc XML) theo chương trình?

Cảm ơn.

Trả lời

7

Nếu khách hàng của bạn muốn sử dụng một phần của URL để định cấu hình loại phản hồi, bạn có thể sử dụng bộ lọc Servlet.

Một cách dễ dàng để thực hiện trọng đại diện (loại phương tiện truyền thông) có thể sử dụng một tham số truy vấn URL:

/nguồn/định dạng todo = json

Bộ lọc Servlet phân tích các tham số truy vấn URL, và nếu một định dạng = json là hiện tại, thay thế hoặc thêm tiêu đề chấp nhận "application/json".

+0

cảm ơn, nhưng tôi có thể cấu hình loại phản ứng unsing 'Response' đối tượng khi trở về từ phương pháp? – MyTitle

+4

Phản hồi có thể chỉ định loại nội dung: trả về Response.ok. (...) .type ("application/json"). build(); – mjn

+3

Nếu bạn cầu kỳ về các URL như tôi ..., bạn có thể sử dụng đuôi tệp: '/ resources/todo.json' hoặc'/resources/todo.xml' – Webnet

4

Không cần cho các lớp riêng biệt, những gì bạn cần là phương pháp riêng biệt:

@GET 
@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON }) 
public Todo getXML() { 
    Todo todo = new Todo(); 
    todo.setSummary("This is my first todo"); 
    todo.setDescription("This is my first todo"); 
    return todo; 
} 

Sau đó ở phía khách hàng, khi bạn yêu cầu sử dụng dịch vụ, bạn chỉ rõ trong định dạng những gì bạn muốn nó:

// Get XML 
System.out.println(service.path("rest").path("todo").accept(MediaType.TEXT_XML).get(String.class)); 
// Get XML for application 
System.out.println(service.path("rest").path("todo").accept(MediaType.APPLICATION_XML).get(String.class)); 
// Get JSON for application 
System.out.println(service.path("rest").path("todo").accept(MediaType.APPLICATION_JSON).get(String.class)); 
+0

cảm ơn, vì vậy tôi hiểu rằng tôi cần phải gửi 'accept' tiêu đề từ khách hàng để có được loại tôi cần. Nhưng làm thế nào tôi có thể trở về loại neccesary từ máy chủ? – MyTitle

+0

Khi bạn thêm chú thích producess, khung công tác sẽ tự động thực hiện cho bạn dựa trên yêu cầu của khách hàng – Tomer

+0

ok ok :) Tôi hiểu nó) Nhưng nếu tôi muốn trả lại kiểu cần thiết tùy thuộc vào một số sự kiện khác (không phải trên 'khách hàng chấp nhận 'header)? Hoặc trong các từ khó hơn, cách trả về 'xml' nếu tiêu đề' accept' của client là JSON? – MyTitle

9

Lưu ý: Tôi là trưởng nhóm EclipseLink JAXB (MOXy) và là thành viên của nhóm chuyên gia JAXB (JSR-222).


Tôi có thể tạo một lớp, chú thích nó với JAXB chú thích (hỗ trợ XML) và tuyên bố trong web.xml cho JSON (thư viện Jackson) hỗ trợ?

Bạn luôn có thể sử dụng lớp học Application để chỉ định MessageBodyReader/MessageBodyWriter cho ràng buộc JSON. Tôi tin rằng Jackson cung cấp một thực hiện trong lọ của nó. Dưới đây là một ví dụ về một lớp Application chỉ rõ MOXY là nhà cung cấp JSON:

package org.example; 

import java.util.*; 
import javax.ws.rs.core.Application; 
import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider; 

public class CustomerApplication extends Application { 

    @Override 
    public Set<Class<?>> getClasses() { 
     HashSet<Class<?>> set = new HashSet<Class<?>>(2); 
     set.add(MOXyJsonProvider.class); 
     set.add(CustomerService.class); 
     return set; 
    } 

} 

Hoặc tôi cần phải tạo riêng hai lớp cho JSON và XML?

EclipseLink JAXB (MOXy) cung cấp ràng buộc XML nguyên gốc và được thiết kế để cho phép bạn sử dụng same object model for both JSON and XML.Bạn có thể tích hợp nó vào ứng dụng JAX-RS của bạn bằng cách sử dụng lớp MOXyJsonProvider:


Làm thế nào tôi có thể lập trình chọn loại trở lại (JSON hoặc XML)?

Server Side

Bạn có thể xác định rằng dịch vụ của bạn cung cấp cả XML và tin nhắn JSON sử dụng @Produces chú thích.

@GET 
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 
@Path("{id}") 
public Customer read(@PathParam("id") long id) { 
    return entityManager.find(Customer.class, id); 
} 

Để biết thêm thông tin

Client Side

Bạn có thể sử dụng MediaType để chỉ ra loại tin nhắn. Dưới đây là ví dụ sử dụng API ứng dụng khách của Jersey. Lưu ý cách URL giống nhau, chỉ loại phương tiện được yêu cầu khác nhau.

Client client = Client.create(); 
WebResource resource = client.resource("http://localhost:8080/CustomerService/rest/customers"); 

// Get XML response as a Customer 
Customer customer = resource.path("1") 
    .accept(MediaType.APPLICATION_XML) 
     .get(Customer.class); 
System.out.println(customer.getLastName() + ", "+ customer.getFirstName()); 

// Get JSON response as a Customer 
Customer customer = resource.path("1") 
    .accept(MediaType.APPLICATION_JSON) 
     .get(Customer.class); 
System.out.println(customer.getLastName() + ", "+ customer.getFirstName()); 

Để biết thêm thông tin

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