首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ContentNegotiation:如何服务于接受标头中的最高排序类型

ContentNegotiation:如何服务于接受标头中的最高排序类型
EN

Stack Overflow用户
提问于 2014-04-23 09:52:05
回答 2查看 1.1K关注 0票数 4

我有这个Spring配置,有几个定制的HttpMessageConverters:

代码语言:javascript
复制
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    configurer.favorParameter(true).
            ignoreAcceptHeader(false).
            useJaf(true).
            defaultContentType(MediaType.TEXT_HTML).
            mediaType("html", MediaType.TEXT__HTML).
            mediaType("rdf", MediaTypes.RDFXML);
}

如果我用Jena查询这个设置,就会得到一个错误:

此请求所标识的资源只能生成根据请求“接受”标头不可接受的特性的响应。

Jena发送带有以下Accept头的请求:

接受:文字/海龟,应用程序/n-三元组;q=0.9,application/rdf+xml;q=0.8,application/xml;q=0.7,/;q=0.5

据我理解,application/rdf+xml应该由上面的配置返回。只要配置了最高值的类型,它就能很好地工作。为什么Spring不回到0.8值的application/rdf+xml,因为text/turtleapplication/n-triples是不可用的?

有什么办法可以激活它吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-23 15:44:08

我可以通过定义不同的MVC处理程序,或者考虑内容类型,然后决定返回什么来实现这一点。

定义不同的处理程序

如果您指定了一个@RequestMapping,该值为produces,那么不管导致您的请求的自动协商是什么,这都将是Content-Type头上的类型。您可以将请求“强制”到这些处理程序,因为它是唯一可以回答的请求。我使用它返回一个更特定的类型,但我怀疑您也可以使用它来返回一个更通用的类型。

代码语言:javascript
复制
@RequestMapping(value="/sparql/service", produces={"application/rdf+xml;charset=utf-8", MediaType.ALL_VALUE})
public @ResponseBody String serviceDescriptionAsRdfXml()
{
    return null; // something here
}

@RequestMapping( value="/sparql/service", produces={"text/turtle;charset=utf-8"} )
public @ResponseBody String serviceDescriptionAsTurtle( final HttpServletRequest request )
{
    return null; // something here
}

对内容型的思考

为了反映进来的类型,并生成更通用的内容,您可以实际检索MediaType对象的列表作为请求的一部分,然后使用ResponseEntity来定义结果的Content-Type。这需要更多的思考。

代码语言:javascript
复制
@RequestMapping(value="/sparql/query", method=RequestMethod.GET)
public ResponseEntity<String> queryViaGet(@RequestHeader(value="Accept") final List<MediaType> contentTypes)
{
    MediaType.sortBySpecificityAndQuality(contentTypes);

    // Do some stuff to select your content type and generate your response
    final String results = null;
    final MediaType desiredType = null;

    // Create your REST response
    final HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.setContentType(desiredType);
    return new ResponseEntity<String>(results, responseHeaders, HttpStatus.OK);
}
票数 1
EN

Stack Overflow用户

发布于 2014-04-23 10:06:13

ContentNegotiationConfigurer.mediaType(String,MediaType)应用于请求解析,并定义从扩展到媒体类型的映射--如果请求没有以Accept标头的形式定义显式媒体类型,但是请求路径以假定指定媒体类型的指定扩展结束。

基本上,ContentNegotiationConfigurer丰富(或修改)请求数据,但不选择实际的响应类型。

您需要的是一个可以产生多个媒体类型或多个控制器(或同一控制器中的多个方法)产生不同媒体类型的控制器,application/rdf+xml就是其中之一。如果application/rdf+xml是请求中的(可能的、丰富的或修改的) Accept报头与您的控制器实际能够产生的内容之间的最高公共媒体类型,那么Spring将自动选择该控制器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23240770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档