3

我正在使用 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 扩展是否重要......

4

1 回答 1

0

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

仅当Accept匹配这些媒体类型之一时才映射

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

于 2013-04-19T12:18:07.233 回答