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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章