我正在使用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扩展是否重要......
答案 0 :(得分:0)
RequestMapping.produces()
缩小了请求范围,因此
仅在接受与其中一种媒体类型
匹配时进行映射
因此,您需要在插件的请求中设置相应的接受标头。仅通过在浏览器中键入URL来生成HTTP GET请求就无法做到这一点。我认为对Chrome有用的一个插件是Advanced REST Client。还有很多其他提供类似功能的产品。或者,尝试使用cURL
使用正确的标头发出请求。