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