如何解决如何从 curl 或 postman 或 swagger Micronaut 传递值 @Body MultipartBody
我在 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";
}
}
如何将文件的值从 postman、curl 或 swagger 传递给控制器?
我尝试了以下事情
curl --location --request POST 'http://localhost:8080/product' \
--form 'file=@"/Users/macbook/Downloads/anand 001.jpg"'
我收到的错误是 Required Body [file] not specified
。我们如何传递值?
解决方法
将 post()
方法的签名更改为使用 @Part
而不是 @Body
并直接使用 byte
数组而不是 MultipartBody
。您还可以在 @Part
注释中定义部件名称,在您的情况下为 file。
它可以是这样的:
@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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。