Spring / Postman内容类型“应用程序/八位字节流”不受支持

Sta*_*kJP 10 rest spring postman

我正在使用邮递员发送以下请求: 在此处输入图片说明

我的控制器如下所示:

@RestController
@RequestMapping(path = RestPath.CHALLENGE)
public class ChallengeController {

    private final ChallengeService<Challenge> service;

    @Autowired
    public ChallengeController(ChallengeService service) {
        this.service = service;
    }

    @ApiOperation(value = "Creates a new challenge in the system")
    @RequestMapping(method = RequestMethod.POST, consumes = {MediaType.MULTIPART_FORM_DATA_VALUE, MediaType.APPLICATION_OCTET_STREAM_VALUE},
        produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseStatus(HttpStatus.CREATED)
    public ChallengeDto create(@ApiParam(value = "The details of the challenge to create") @RequestPart("challengeCreate") @Valid @NotNull @NotBlank ChallengeCreateDto challengeCreate,
                           @ApiParam(value = "The challenge file") @RequestPart("file") @Valid @NotNull @NotBlank MultipartFile file) {
        return service.create(challengeCreate, file);
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试更改“消耗”以将APPLICATION_OCTET_STREAM_VALUE删除为MULTIPART_FORM_DATA_VALUE,并且还尝试将其删除,但是这些都无济于事。

如果您需要更多信息,请告诉我。谢谢。

Irf*_*sim 37

@Rokin 答案很好,但不需要将 json 放在文件中并上传。您也可以通过将内容类型传递给 json 对象来实现。邮递员在发送表单数据时支持内容类型选项。进一步参见下面的自我描述图像。

在此处输入图片说明

  • 由于这是获得最多支持的答案,因此我添加了从 @John 的答案中获得的额外要点 - Content-Type 是一个标头设置,默认为“application-octet-stream”。为了避免该错误,请将标头中的“Content-Type”值设置为包含“application/json”。 (4认同)

Rok*_*jan 17

对于 Spring 的 @RequestPart 使用 json 对象,在 Postman 中 - 您需要将 json 对象作为File而不是Text 发送

ChallengeCreateDto的内容放在一个 json 文件中,并保存为challenge.json。然后在 Postman 中上传这个文件,类型为File。我附上了一张 Postman 中的请求的截图,只是为了让它更清晰。

在此处输入图片说明

您还可以在较新版本的 Spring 中使用 @PostMapping 而不是 @RequestMapping,如下所示

@ResponseStatus(HttpStatus.CREATED)
@PostMapping()
public ChallengeDto create(@RequestPart("challengeCreate") ChallengeCreateDto challengeCreate, 
    @RequestPart("file") MultipartFile file) {
        return service.create(challengeCreate, file);
    }

Run Code Online (Sandbox Code Playgroud)

  • 或者,您可以通过三点菜单显示“内容类型”列,并将内容类型设置为“application/json”。比先将 json 数据保存为文件更容易。 (10认同)
  • @DenisK 非常好的提示。 (2认同)

Piy*_*dra 6

使用@RequestParam来获取字符串和文件将解决这个问题。在 Postman 中,使用 Content-Type 作为“multipart/form-data”,并在 Body 中将您的输入定义为表单数据。

请参阅/sf/answers/2683534451/

例子:

 @PostMapping(consumes = {"multipart/form-data"})
public Output send(@RequestParam String input, @RequestParam MultipartFile file) {

}
Run Code Online (Sandbox Code Playgroud)