gpt4 book ai didi

java - 内容协商 : How to serve other than the highest ranking type from accept header

转载 作者:搜寻专家 更新时间:2023-11-01 03:23:13 26 4
gpt4 key购买 nike

我有这个带有几个自定义 HttpMessageConverter 的 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 header 的请求:

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/turtleapplication/n-triples 是不可用?

是否有激活它的选项?

最佳答案

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

定义不同的处理程序

如果您指定一个 @RequestMapping产生一些值,那么无论将您的请求引导到那里的自动协商。您可以通过成为唯一可以回答的人来“强制”向这些处理程序提出请求。我用它来返回一个更具体的类型,但我怀疑您也可以使用它来返回一个更通用的类型。

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

反射(reflection)内容类型

要反射(reflect)传入的类型,并生成更通用的内容,那么您实际上可以检索 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 - 内容协商 : How to serve other than the highest ranking type from accept header,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23240770/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com