Spring MVC为application / octet-stream提供HTTP 406

时间:2013-04-19 09:05:00

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

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

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 - 此请求标识的资源只能根据请求“accept”标头生成具有不可接受特征的响应。

我已将我的应用程序部署到localhost上的tomcat服务器。

关于让浏览器下载二进制数据我必须做些什么的想法?

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

1 个答案:

答案 0 :(得分:0)

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

  

仅在接受与其中一种媒体类型

匹配时进行映射

因此,您需要在插件的请求中设置相应的接受标头。仅通过在浏览器中键入URL来生成HTTP GET请求就无法做到这一点。我认为对Chrome有用的一个插件是Advanced REST Client。还有很多其他提供类似功能的产品。或者,尝试使用cURL使用正确的标头发出请求。