[英]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/json
, application/xml
, application/x-protobuf
媒體類型需要序列化不同的域類型,則可以使用不同的方法來處理不同的類型。 例如, application/json
和application/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.