代码之家  ›  专栏  ›  技术社区  ›  Menelaos

返回inputstream的控制器-内容协商和媒体类型

  •  0
  • Menelaos  · 技术社区  · 6 年前

    介绍

    我有一个关于restcontroller和测试的问题。

    我有以下内容 PostMapping :

    @PostMapping(path = "/download/as/zip/{zipFileName}" )
        @ResponseBody
        public ResponseEntity<InputStreamResource> downloadDocumentZip(@RequestHeader(required=false,name="X-Application") String appName, @RequestBody ZipFileModel zipFileModel, @PathVariable("zipFileName") String zipFileName)
    

    我有以下测试:

    Response response = given(this.requestSpecification).port(port)
                    .filter(document("downloadAsZip",
                            preprocessRequest(prettyPrint()),
                            requestHeaders(headerWithName("X-Application").description("Owner application")),
                            pathParameters(parameterWithName("zipFileName").description("The name of the resulting zip file. Mostly not needed/optional.")))
                    )
                    .contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)
                    .header(new Header(HEADER, "themis"))
                    .body(jsonContent)
                    .when()
                    .post("/download/as/zip/{zipFileName}", "resultFile.zip");
    

    这项工作和200被退回。

    第一个问题

    现在我对 .contentType(MediaType.APPLICATION_JSON_UTF8_VALUE) 在测试中。

    Content-Type是返回响应的头。但在这个测试中,它是在提出测试请求时包含的? 或者在这种情况下,它是否表示我们正在请求主体中发送JSON?

    第二个问题

    我知道我的控制器方法应该使用JSON,并返回字节。 因此,我做了以下更改:

    @Postmapping(path=“/download/as/zip/zipFileName”,使用= MediaType.APPLICATION_JSON_VALUE)

    到目前为止,这是可行的。

    因此,我添加了以下内容:

    @PostMapping(path = "/download/as/zip/{zipFileName}", consumes = MediaType.APPLICATION_JSON_VALUE, 
    produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
    

    失败了:

    java.lang.AssertionError: 
    Expected :200
    Actual   :406
     <Click to see difference>
    

    所以我把测试改为:

    .contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)
                    .accept(MediaType.APPLICATION_OCTET_STREAM_VALUE)
    

    这又一次失败了。

    Expected :200
    Actual   :406
    

    因此,即使客户机发出的信号与控制器产生的接收头相同,我们也有一个错误。

    问题:

    1. 所以我们应该还是不应该 produces= 在请求映射上?
    2. 为什么现在失败了?在使用JSON和生成字节时是否存在冲突?或 ContentType 在测试中?
    1 回复  |  直到 6 年前
        1
  •  0
  •   Menelaos    6 年前

    问题是,如果URL的结尾有扩展名,那么Spring会更改返回内容类型。

    因此,看到结尾的.zip,会导致Spring将类型转换为application/zip。

    推荐文章