Spring Cloud Feign 各种客户端入参示例

写在前面

本文记录下本人遇到的那些奇葩的接口的入参方式,以及使用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

常见报错

  1. java.lang.IllegalStateException: Method has too many Body parameters
    一个feign的请求方法只能有一个参数是@RequestBody注释,其他使用@RequestParam

  2. Request method ‘POST’ not supported
    请求不支持’POST’方法,原因可能是传参的时候使用了@RequestBody,这个时候方法有@GetMapping注解,依然被认为是post请求,解决方法同奇葩操作一。

  3. 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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

糕天原

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值