1

我在 Micronaut 中有一个简单的下面的 post 方法,它将图像发送到控制器,如下所示

@Controller("/product")
public class ProductController {

    @Post(consumes = MediaType.MULTIPART_FORM_DATA, produces = MediaType.MULTIPART_FORM_DATA)
    public String post(@Body MultipartBody file){
        return "This is multipost";
    }
}

如何将文件的值从邮递员、curl 或 swagger 传递给控制器​​?

我尝试了以下事情

curl --location --request POST 'http://localhost:8080/product' \
--form 'file=@"/Users/macbook/Downloads/anand 001.jpg"'

在此处输入图像描述

我得到错误为Required Body [file] not specified. 我们如何传递价值?

4

1 回答 1

1

将方法的签名更改post()为使用@Part而不是@Body直接使用byte数组而不是MultipartBody。您还可以在@Part注释中定义零件名称,在您的情况下是文件

它看起来像这样:

@Controller("/products")
public class ProductController {

    @Post(consumes = MediaType.MULTIPART_FORM_DATA)
    public String post(@Part("file") byte[] file) {
        return "Received: " + new String(file, StandardCharsets.UTF_8);
    }

}

和示例 curl 调用:

curl -X POST 'http://localhost:8080/products' -F 'file=@/home/cgrim/tmp/test.txt'

...回应:

Received: Some dummy data in text file.

所以问题不在于您的 curl 命令或来自 Postman 的调用,而在于控制器实现。


这是该操作的声明性客户端示例:

@Client("/products")
public interface ProductClient {
    @Post(produces = MULTIPART_FORM_DATA)
    HttpResponse<String> createProduct(@Body MultipartBody body);
}

该客户端可以这样使用:

var requestBody = MultipartBody.builder()
    .addPart("file", file.getName(), TEXT_PLAIN_TYPE, file)
    .build();
var response = client.createProduct(requestBody);
于 2021-03-06T08:46:21.980 回答