【OpenFeign】 POST 示例

Metadata

title: 【OpenFeign】 POST 示例
date: 2023-01-02 19:44
tags:
  - 行动阶段/完成
  - 主题场景/组件
  - 笔记空间/KnowladgeSpace/ProgramSpace/ModuleSpace
  - 细化主题/Module/OpenFeign/示例
categories:
  - OpenFeign
keywords:
  - OpenFeign
description: 【OpenFeign】 POST 示例

【OpenFeign】 POST 示例

POST 请求一般用于数据提交到服务器,比如添加数据,上传文件等。

1. 传递单个对象参数

默认形参没有添加注解时,就会放入到请求体中,这个时候会使用编码器,将对象编码,并以Content-Type: application/json形式发送请求,所以只要注意在服务提供者中,添加@RequestBody注解,将请求体转为对象即可。

@PostMapping("addOrder")
    public Order addOrder(@RequestBody Order order);

2. 传递多个对象参数

如果像下面这样使用两个@RequestBody,是会报错的:

@PostMapping("addOrderAnd")
    public Order addOrderAnd(@RequestBody Order order,@RequestBody Account account);

这时候需要将两个对象封装在一个对象中,变成单个对象进行请求传递:

@PostMapping("addOrderAnd")
    public Order addOrderAnd(@RequestBody AccountAndOrder accountAndOrder);

3. 上传文件

上传文件时,需要注意的是需要使用@RequestPart注解,Fiegn 会解析这个注解,标记为上传文件请求,还需要指定consumesMULTIPART_FORM_DATA_VALUE,编码器会根据这个配置,将文件对象进行编码。

@PostMapping(value = "/spring/upload",consumes = MediaType.MULTIPART_FORM_DATA_VALUE,produces =MediaType.APPLICATION_JSON_VALUE )
    @ResponseBody
    public Object springUpload(@RequestPart("file") MultipartFile file) ;

在调用方,上传文件时,则需要将文件对象转为MultipartFile

一般不采用 Feign 去上传文件,这种方式请求链路比较长,性能很低,一般都是前端直接上传到文件服务器,然后再告诉后台上传了哪个文件。

@GetMapping("/insertOrder")
    public Object insertOrder() {
        File file = new File("E:\\javaPro\\prime-code-generator\\pom.xml");
        MultipartFile multipartFile =fileToMultipartFile(file);
        Object o = orderFeign.springUpload(multipartFile);
        return o;
    }

    public static MultipartFile fileToMultipartFile(File file) {
        String fieldName = "file";
        FileItemFactory factory = new DiskFileItemFactory(16, null);
        FileItem item = factory.createItem(fieldName, "multipart/form-data", true, file.getName());
        int bytesRead = 0;
        byte[] buffer = new byte[8192];
        try {
            FileInputStream fis = new FileInputStream(file);
            OutputStream os = item.getOutputStream();
            while ((bytesRead = fis.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new CommonsMultipartFile(item);
    }