最近在將乙個springbbot分布式sso工程改造成基於springcloud的微服務工程 。在feign端消費服務的時候傳引數時候出現了一些問題,然後查了些資料,自己總結了下。特意記錄下。
關於feign消費服務時候get/post方式,單參,多參,可以看如下這篇文章:
這篇文章講解的很詳細,主要分析@requestparam和@requestbody兩個註解在使用post/get時候的具體情況。
總結一下:
現在說的是feign作為消費方去消費服務,
1get方式消費
服務提供者:
a在所有引數前加上@requestparam註解。method可加,可不加,為了簡單,個人覺得直接加上。
2post方式消費服務提供者
a在所有引數前加上@requestparam註解。method加上post.
b 使用@requestbody註解(有且至多乙個,多了報錯),其他的引數前,必須使用@requstparam。
注:在服務消費者中,使用feign消費服務時,如果引數前什麼也不寫,那麼預設是由@requestbody指明的。
具體來說:分無參,單參和多引數
無參和單參的情況不在此列舉。
注意:單參引數前未使用@requestparam或引數前使用了@requestbody註解(此時不論是否手動指定請求方式、不論指定的方式是post還是get,那麼最終都以post方式消費服務)
注意:@requestbody註解的引數,需要post方式才能傳遞資料。
注意:@requstparam("name"),這個變數名說是可加,可不加(接受引數名字和傳遞過來變數名字一致時候),建議加上。測試時候省事。
服務提供者:
在服務提供者的controller中,
如果要接收(服務消費中傳過來的)被@requestbody指明的引數,那麼對應方法的對應引數前一定要有@requestbody;(如果沒有的話,收到的引數值就為null;如果寫成@requestparam的話,那麼feign呼叫會失敗)
如果要接收(服務消費中傳過來的)被@requestparam指明的引數,那麼可以寫@requestparam,也可以不寫(當服務提供者中對應的引數名字與服務消費者傳過來的引數名字一致時,可以不寫,不一致時,需要寫)
多引數:
1以get方式消費服務提供者
全部引數加上@requestparam,method可加可不加,建議加上。
2以post方式消費服務提供者
多引數時,如果服務消費者想採用post進行feign呼叫,那麼:服務消費者中該介面方法裡的這些引數前,最多只能有乙個引數是@requestbody指明的,其餘的引數必須使用@requestparam指明。 如:
等同於(string name 這個引數前什麼也不寫,那麼預設的即為@requestbody)
如果服務消費者這邊feign呼叫時,所有引數前面都使用了@requestparam註解時,但是指明的是post方式,那麼最終還是以post方式進行的(如果全使用了@requestparam註解,不指定post方法,預設是get方式。):
服務提供者接收時:
◎如果服務消費者傳過來引數時,全都用的是@requestparam的話,那麼服務提供者的controller中對應引數前可以寫@requestparam,也可以不寫(當兩邊引數名字一致時,可以省略不寫)
◎如果服務消費者傳過來引數時,有@requestbody的話,那麼服務提供者的controller中對應引數前必須要寫@requestbody(如果是多引數的話,其餘引數前視情況可以寫@requestparam,也可以不寫)
注意:如果介面與介面的實現分別處於兩個服務中,那麼介面就相當於服務消費者,而介面的實現則相當於服務提供者。兩者之間仍然滿足本文上所述要求。
注意:服務提供者一般情況下,返回json,所以千萬別漏了@restcontroller或者@responebody.否則測試時候,要整半天。
針對最後一點,如果說從postman直接訪問的controller中通過feignclient的介面呼叫服務,那麼如果controller的形參如果沒有繫結@requestbody,那麼此時springmvc預設採用的是接受引數方式是取request中的params中的引數,header中引數和body中的json格式的引數都不會被獲取,只有在controller行參上加了@requestbody才能獲取到(此問題在測試時候會出現)。
故:一般情況,接受頁面傳參,採用springmvc預設機制。
有不對的地方請指正。
vue傳參,元件之間傳參 路由傳參 vuex
詳見 兩種情況 params 和 query 都可以在目標元件的生命週期裡,通過 this.route 進行獲取 例 首頁中精選主題的路由傳參 精選主題 1 簡單舉例 a 一般會新建 store 資料夾,在 index.js 初始化 vuex b 在 main.js 中,引入 c 例如,在我的頁面修...
params傳參和query傳參
params傳參 this.router.push query傳參 this.router.push 1 用法上的 query要用path來引入,params要用name來引入,接收引數都是類似的,分別是this.route.query.name和this.route.params.name。注意接...
params傳參和query傳參
當你使用params方法傳參的時候,要在路由後面加引數名,並且傳參的時候,引數名要跟路由後面設定的引數名對應。使用query方法,就沒有這種限制,直接在跳轉裡面用就可以。注意 如果路由上面不寫引數,也是可以傳過去的,但不會在url上面顯示出你的引數,並且當你跳到別的頁面或者重新整理頁面的時候引數會丟...