1. FEIGN 常见问题

1.1 400 Bad Request 问题

1.1.1 问题描述

在使用feign调用的使用出现400 Bad request的问题。

1.2.2 代码如下

@PostMapping("/system/core/sysMenu/getMenusByIdsAndTypes")
    List<SysMenuDto> getMenusByIdsAndTypes(@RequestParam("menuIds") String menuIds,
                                             @RequestParam("menuType") String menuType);

这个 menuIds 数量比较多,导致400 错误。发现问题出在menuIds 跟在URL后面。

1.1.3 解决办法

将方法修改为:

List<SysMenuDto> getMenusByIdsAndTypes(@RequestBody MultiValueMap<String,String> queryParam);

调用方法修改成:

public List<SysMenuDto> getMenusByIdsAndNotType(String menuIds, String menuType){
        MultiValueMap valueMap=new LinkedMultiValueMap();
        valueMap.add("menuIds",menuIds);
        valueMap.add("menuType",menuType);
        return systemClient.getMenusByIdsAndTypes(valueMap);
    }

1.2. 非法字符错误

1.2.1 错误信息

在流程调用表单接口的时候抛出如下的错误。

Illegal character ((CTRL-CHAR, code 31)): only regular white space (\r, \n, \t) is allowed between tokens

1.2.2 错误原因

是feign 调用的时候启用了压缩。

1.2.3 解决办法

关闭压缩即可。

将配置改成:

feign.compression.request.enabled=false
feign.compression.response.enabled=false

1.3. 字符串中文乱码问题

1.3.1 错误信息

在Feign调用时,传到目标服务的方法中,字符串里的中文变成问号了

1.3.2 解决办法

在Feign的接口的注解中指定consumes字符集:

  @PostMapping(value = "/portal/core/appdata/install",consumes = "application/json;charset=UTF-8")
    void install(@RequestBody String data);

如果此时data为”[{},{}]”格式的JSON字符串,即JSON数组字符串,又会报参数类型不匹配的错误,要把参数改为对象数组或者List对象:

  @PostMapping(value = "/portal/core/appdata/install",consumes = "application/json;charset=UTF-8")
    void install(@RequestBody Object[] data);
文档更新时间: 2022-03-12 14:35   作者:zyg