feign以form方式提交多个参数,以map进行传递
向大家介绍feign以form方式提交多个参数,主要包括feign以form方式提交多个参数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
问题,FeignClient多参数使用@RequestParam传递 代码示例:
@RequestMapping("send2User") String send2User(@RequestParam("sign")String sign, @RequestParam("fromUsername")String fromUsername, @RequestParam("toUsername")String toUsername, @RequestParam("content")String content, @RequestParam("isImmediately")Integer isImmediately, @RequestParam("ext")String ext);
参数改为map: 添加依赖,这两个是feign团队扩展的jar包,用于form提交的
<dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form</artifactId> <version>3.2.2</version> </dependency> <dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>feign-form-spring</artifactId> <version>3.2.2</version> </dependency>
创建一个Encoder,其中关键一句是:super.encode(data, MAP_STRING_WILDCARD, template)
import java.lang.reflect.Type; import java.util.HashSet; import java.util.Map; import java.util.Set; import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl; import feign.RequestTemplate; import feign.codec.EncodeException; import feign.form.spring.SpringFormEncoder; public class MyEncoder extends SpringFormEncoder{ public void encode(Object object, Type bodyType, RequestTemplate template) throws EncodeException { if (((ParameterizedTypeImpl) bodyType).getRawType().equals(Map.class)) { Map<String,?> data = (Map<String, ?>) object; Set<String> nullSet = new HashSet<>(); for (Map.Entry<String, ?> entry : data.entrySet()) { if (entry.getValue() == null) { nullSet.add(entry.getKey()); } } for (String s : nullSet) { data.remove(s); } super.encode(data, MAP_STRING_WILDCARD, template); // int i=1/0; return; } super.encode(object, bodyType, template); } }
注意:加一句int i=1/0;可以debug找出源码调用的流程 创建一个config,引入自定义的Encoder
import org.springframework.context.annotation.Bean; import feign.codec.Encoder; public class FormSupportConfig { @Bean public Encoder feignFormEncoder() { return new MyEncoder(); // return new SpringFormEncoder(); } }
client的注解加上config
@FeignClient(value="chatclient",path="chatclient",configuration=FormSupportConfig.class)
方法修改为map参数
@PostMapping(value = "send2User", consumes = { MediaType.MULTIPART_FORM_DATA_VALUE }) String send2User(Map<String, String> map);
注意:feignclient中其他方法不用修改,可以兼容。