编程语言
首页 > 编程语言> > java – ContentNegotiation:如何从accept头中提供除最高排名类型以外的服务

java – ContentNegotiation:如何从accept头中提供除最高排名类型以外的服务

作者:互联网

我有几个自定义HttpMessageConverters的Spring Java配置:

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查询此设置,则会收到错误消息:

The resource identified by this request is only capable of generating
responses with characteristics not acceptable according to the request
“accept” headers

Jena使用此Accept标头发送请求:

Accept:
text/turtle,application/n-triples;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 / turtle和application / n-triples不可用?

有没有激活它的选项?

解决方法:

我通过定义不同的MVC处理程序,或通过反映内容类型然后决定返回什么来实现这一点.

定义不同的处理程序

如果您指定生成某个值的@RequestMapping,那么这将是您的Content-Type标头上的类型,无论在哪里引导您的请求的自动协商.您可以通过成为唯一可以回答的人来“强制”请求这些处理程序.我使用它来返回更具体的类型,但我怀疑你也可以使用它来返回更通用的类型.

@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对于您的结果的内容.这需要多一点思考.

@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);
}

标签:java,spring,jena,content-negotiation
来源: https://codeday.me/bug/20190703/1364924.html