向大家介紹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中其他方法不用修改,可以兼容。