在RESTful API中,很典型的做法是查看可以支持多种序列化格式的端点:
// Sends back "fizz" resource that has an id=34 as a JSON object
http://api.example.com/v2/fizz/34.json
// Sends back "fizz" resource that has an id=34 as an XML object
http://api.example.com/v2/fizz/34.xml
// Sends back "fizz" resource that has an id=34 as a binary object,
// say, using Google Protocol Buffers
http://api.example.com/v2/fizz/34.bin
我正在设计一个Dropwizard服务,并试图弄清楚如何实现多种格式支持,但是在这方面文档很贫乏。有任何想法吗?
最佳答案
通常,只需在@Produces
和@Consumes
批注中声明性地完成对不同格式配置的支持。客户端发送数据时,应将Content-Type
请求标头设置为要发送的数据的实际类型。
例如,如果客户端正在发送JSON数据,则客户端应设置请求标头Content-Type: application/json
。泽西岛将使用@Consume("application/json")
查找方法或类。如果找到它,则表示该应用已配置为支持媒体类型application/json
。如果不是,则客户端将返回响应,说明不支持媒体类型。
同样,当客户端请求数据时,应设置Accept: application/json
请求标头。泽西岛将查找@Produces("application/json")
。如果找不到端点,则客户端将收到一条消息,指出它不是可接受的类型。
因此,我们可以为同一端点支持不同的媒体类型。您可以像这样声明方法
@Produces({"application/json", "application/xml", "application/x-protobuf"})
public Response getFoo() {
return Response.ok(new Foo());
}
您需要担心的是每种媒体类型是否都有一个
MessageBodyWriter
可以处理Foo
类型的序列化。在JAX-RS Entity Providers上查看更多信息。另外,如果
application/json
,application/xml
,application/x-protobuf
媒体类型需要序列化不同的域类型,则可以使用不同的方法来处理不同的类型。例如,application/json
和application/xml
,通常可以避免使用相同的Foo
域对象,因此您可以@Produces({"application/xml", "application/json"})
public Response getFooJsonOrXml() {
return Response.ok(new Foo());
}
但是对于Protobuf,它需要Protobuf编译的类。因此,您将返回生成的类型,而不是
Foo
域对象。@Produces("application/x-protobuf")
public Response getFooProtobuf() {
return Response.ok(new ProtobufFoo());
}
至于您在URL中使用
.xml
,.json
扩展名,通常这不是客户端说出所需类型的方法。如上所述,通常将Accept
请求标头设置为服务器支持的一种类型。但是它支持URL类型扩展,但这通常是为那些无权设置标题的客户端(例如浏览器)提供的。但是您需要使用
UriConnegFilter
配置那些媒体类型映射。例如Map<String, MediaType> map = new HashMap<>();
map.put("xml", MediaType.APPLICATION_XML_TYPE);
map.put("json", MediaType.APPLICATION_JSON_TYPE);
map.put("bin", ProtocolBufferMediaType.APPLICATION_PROTOBUF_TYPE);
env.jersey().property(ServerProperties.MEDIA_TYPE_MAPPINGS, map);
也可以看看:
Dropwizard and Protocol Buffers by example
Limit path media type mappings in Jersey
JAX-RS Entity Providers
关于java - Dropwizard支持多种序列化格式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32513922/