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

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

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

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

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

我的 Controller 看起来像这样:

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

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

对于让浏览器下载二进制数据我必须做什么有什么想法吗?

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

最佳答案

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

only mapped if the Accept matches one of these media types

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

关于spring-mvc - Spring MVC 为 application/octet-stream 提供 HTTP 406,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16101016/

相关文章:

spring-mvc - Spring4 MVC无法识别JSPS

symfony - 如何在 symfony 中获取请求 header value

java - 添加 X-Content-Type-Options Nosniff

spring-mvc - ModelAndView 中的 getModel() 与 getModelMap()

spring-mvc - 获取当前凭据以访问其他 REST 服务

java - Neo4j Spring 数据 : Is it possible to use Relationship Entity as End Node of other Relationship Entity?

java - 通过 Jersey 客户端调用 REST api 时添加多个 header

web-services - 不使用 IIS(自定义 Web 服务器)的 asmx Web 服务的独立实现(服务器端!)

jQuery - 获取 AJAX 响应 header

c - 在 C 中使用 OpenSSL 接收 http 响应消息