控制器返回输入流-内容协商和媒体类型



简介

我有一个关于RestController和Test的问题。

我有以下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)的含义有点困惑。

内容类型是返回响应的标头。但在这个测试中,它是在提出测试请求时包含的吗或者在这种情况下,这是否意味着我们正在请求主体中发送JSON

第二个问题

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

@PostMapping(路径="/download/as/zip/{zipFileName}",consumps=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

问题是,如果URL的末尾有扩展名,spring会更改返回内容类型。

因此,看到最后的.zip,导致spring将类型转换为application/zip。

相关内容

  • 没有找到相关文章

最新更新