簡體   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