【问题标题】:Spring MVC gives HTTP 406 for application/octet-streamSpring MVC 为 application/octet-stream 提供 HTTP 406
【发布时间】:2013-04-12 15:13:09
【问题描述】:

我正在使用 Spring Web MVC 并编写了一个控制器,它将二进制数据返回到显示 3D 内容的网页中的插件。这个插件使用 STK 文件作为它的模型,所以我设置了我的 webapp 来为 *.stk URLs 生成这种内容

springDispatcherServlet 设置为在我的 web.xml 中处理 *.stk 请求

<servlet-mapping>
    <servlet-name>springDispatcherServlet</servlet-name>
    <url-pattern>*.stk</url-pattern>
</servlet-mapping>

我的控制器如下所示:

@Controller
@RequestMapping(value="/3dobject", produces="application/octet-stream")
public class Object3DController {

    @Autowired
    private DesignerService designerService;

    @RequestMapping(value="/{article}.stk", method=RequestMethod.GET, headers="Accept: application/octet-stream")
    public void getObject3DForArticle(HttpServletResponse response, @PathVariable String article) throws IOException {
        response.setContentType("application/octet-stream");
        Object3D object = designerService.get3DModelForArticleNumber(article, LanguageCode.NORWEGIAN);
        byte[] content = object.getContent();
        response.setContentLength(content.length);
        IOUtils.write(content, response.getOutputStream());
    }
}

当我尝试通过浏览器访问数据时,出现以下错误:

HTTP 状态 406 - 此请求标识的资源只能生成具有根据请求“接受”标头不可接受的特征的响应。

我已将我的应用程序部署到本地主机上的 tomcat 服务器。

有什么想法可以让浏览器下载二进制数据吗?

PS!我从 *.3do(3d 对象)更改为 *.stk。使用 3do 它按预期工作,但插件失败并出现错误(这很难解释),所以我必须进行试验以验证 URL 扩展是否重要......

【问题讨论】:

  • 我在 @RequestMapping 注释中添加了 headers="Acceot: application/octet-stream" 只是为了测试目的。它并没有像预期的那样改变任何东西。 :)
  • 您发出的HTTP 请求的Accept 标头不正确或缺失。插件需要将 Accept 标头设置为 application/octet-stream 以访问产生 application/octet-stream 的控制器
  • 目前我只用浏览器测试 URL,它有一个包含 */* 的 Accept 标头。我认为这意味着浏览器会加载任何内容..
  • 仅供参考:来自浏览器的 Accept 标头是 Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  • 插件错误是什么?

标签: spring-mvc http-headers httpresponse http-error


【解决方案1】:

RequestMapping.produces() 缩小了请求范围,因此是

仅当 Accept 匹配其中一种媒体类型时才映射

所以你需要在插件的请求中设置相应的Accept头。这不能通过在浏览器中输入 URL 来简单地发出 HTTP GET 请求来完成。我发现对 Chrome 有用的一个插件是 Advanced REST Client。还有很多其他提供类似功能的。或者尝试使用cURL 使用正确的标头发出请求。

【讨论】:

  • 这如何解释它通过带有 *.3do 扩展名的浏览器按预期工作的事实?
  • 抱歉,您是说浏览器上的 URL 中带有*.3do 的请求返回正确吗?
  • 是的。它返回浏览器尝试保存到我的下载文件夹中的正确二进制数据。但是,如果我改为改为 .stk 扩展名,它会失败..
猜你喜欢
  • 2014-06-08
  • 2023-02-05
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 2023-03-08
  • 1970-01-01
相关资源
最近更新 更多