繁体   English   中英

Dropwizard支持多种序列化格式

[英]Dropwizard support for multiple serialization formats

在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());
} 

您需要担心的是对于每种可以处理Foo类型序列化的媒体类型, 是否都有一个MessageBodyWriter JAX-RS实体提供者中查看更多内容。

另外,如果application/jsonapplication/xmlapplication/x-protobuf媒体类型需要序列化不同的域类型,则可以使用不同的方法来处理不同的类型。 例如, application/jsonapplication/xml ,通常Foo使用相同的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);

也可以看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM