写在前面
本文记录下本人遇到的那些奇葩的接口的入参方式,以及使用Feign的传参姿势。
正文
正常操作
-
服务端:
- @GetMapping+@RequestParam
- @PostMapping+@RequestBody
-
客户端:和服务端保持一致即可
奇葩操作
- 服务器
-
@GetMapping+@RequestBody, 这个是比较常见的了,解决方法是:
方法一:如果参数字段不多,就拆开对象的字段用@RequestParam注释传。
方法二:如果不想用一,那么客户端就用Map类型传参,用@RequestParam,对象转map方法在文末。
方法三:更换请求方式,详见https://blog.csdn.net/FAw67J7/article/details/79885566 -
@PostMapping+@RequestParam ,很好理解,在所有参数前加上@RequestParam注解。method加上Post。
-
@PostMapping + 多参数,只能有一个参数是@RequestBody注释,其他使用@RequestParam
-
常见报错
-
java.lang.IllegalStateException: Method has too many Body parameters
一个feign的请求方法只能有一个参数是@RequestBody注释,其他使用@RequestParam -
Request method ‘POST’ not supported
请求不支持’POST’方法,原因可能是传参的时候使用了@RequestBody,这个时候方法有@GetMapping注解,依然被认为是post请求,解决方法同奇葩操作一。 -
feign.FeignException$InternalServerError: status 500 reading
这个可能是接收服务传回来的参数时序列化错误导致,检查接收参数的对象字段是否和返回的参数字段格式相同。
结束
工具类代码
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.math.BigDecimal;
import java.util.*;
/**
* Created by zrc on 2020-01-06.
*/
public class SwitchUtils {
public static String bigDecimal2String(BigDecimal num){
if(num==null){
return null;
}
return num.stripTrailingZeros().toPlainString();
}
//对象转成map传参
public static Map objectToMap(Object o) {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
String os = null;
Map map = null;
try {
os = mapper.writeValueAsString(o);
map = mapper.readValue(os,Map.class);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return map;
}
/**
* 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串
*
* @param params 需要排序并参与字符拼接的参数组
* @return 拼接后字符串
*/
private static String createLinkString(Map<String, String> params) {
return createLinkString(params, true);
}
/**
* 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串
*
* @param params 需要排序并参与字符拼接的参数组
* @return 拼接后字符串
*/
private static String createLinkString(Map<String, String> params, boolean sort) {
List<String> keys = new ArrayList<String>(params.keySet());
if (sort) {
Collections.sort(keys);
}
String prestr = "";
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
String value = params.get(key);
if (i == keys.size() - 1) {//拼接时,不包括最后一个&字符
prestr = prestr + key + "=" + value;
} else {
prestr = prestr + key + "=" + value + "&";
}
}
return prestr;
}
}