当前位置: 首页 > 知识库问答 >
问题:

内容协商:如何从接受标题中提供最高排名类型以外的服务

孟思远
2023-03-14

我有这个SpringJava配置与几个自定义HttpMessageConverters:

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,应用程序/rdf xml;q=0.8,应用程序/xml;q=0.7,/;q=0.5

据我所知,application/rdfxml,应该由上面的配置返回。只要配置了具有最高值的类型,这就可以完美地工作。为什么Spring不回到0.8值的应用程序/rdf xml,因为text/turtleapplication/n-triples不可用?

有激活该选项的选项吗?

共有2个答案

须旭
2023-03-14

内容谈判Configurer.media类型(String, MediaType)适用于请求解析,并定义了从扩展到媒体类型的映射-如果请求没有以接受标头的形式定义显式媒体类型,但请求路径结束使用指定的扩展,假设指定的媒体类型。

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

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

鄢开诚
2023-03-14

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

定义不同的处理程序

如果指定了一个@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
}

对内容类型的反思

要考虑进来的类型,并产生更通用的东西,那么您实际上可以检索一个MediaType对象列表作为请求的一部分,然后使用响应实体来定义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);
}

 类似资料:
  • 我创建了WCF服务,该服务将由需要接受内容类型application/xml;charset=UTF-8和SOAP1.1信封命名空间的第三方使用。该服务当前正在接受text/xml;charset=utf-8。不允许客户端更改内容类型。 我没有对web.config文件做任何更改,除了设置basicHttpBinding MaxReceivedMessageSize。

  • Apache支持HTTP/1.1规范中定义的内容协商,它可以根据浏览器提供的参数选择一个资源最合适的媒体类型、语言、字符集和编码的表现方式。它还实现了一些对浏览器发送不完整内容协商信息进行智能处理的能力。 内容协商由mod_negotiation模块支持,并被默认编译进服务器。 关于内容协商(Content Negotiation) 一个资源可能会有多种不同的表现形式,比如,可能会有不同语言或者媒

  • You can configure how Spring MVC determines the requested media types from the request. The available options are to check the URL path for a file extension, check the "Accept" header, a specific quer

  • 问题内容: 我有一个Web服务,当在不指定回调的情况下调用该服务时,将使用内容类型返回JSON字符串。 指定回调后,它将JSON字符串包装在回调函数中,因此它不再是真正有效的JSON。我的问题是,在这种情况下还是应该继续使用? 问题答案: 使用应用程序/ javascript。这样,客户端可以依靠内容类型,而不必手动检查响应是否具有填充。

  • 主要内容:关于内容协商Apache HTTPD支持规范中描述的内容协商。它可以根据浏览器提供的媒体类型,语言,字符集和编码首选项,选择资源的最佳表示形式。它还实现了一些功能,可以更智能地处理来自发送不完整协商信息的浏览器的请求。 内容协商由模块提供,该模块默认编译。 关于内容协商 资源可以以多种不同的表示形式提供。例如,它可能以不同语言或不同媒体类型或组合形式提供。选择最合适选择的一种方法是为用户提供索引页面,然后让他

  • 内容协商是基于客户端或服务器偏好选择多种可能的表示之一以返回客户端的过程。 确定接受的渲染器 REST framework 根据可用的渲染器,每个渲染器的优先级以及客户端的 Accept: header,使用简单的内容协商风格来确定应将哪些媒体类型返回给客户端。所使用的风格部分由客户端驱动,部分由服务器驱动。 更具体的媒体类型优先于较不特定的媒体类型。 如果多种媒体类型具有相同的特性,则优先根据为