Feign設置Header頭部

今天嘗試用feign去調用其他部門提供的一個HTTP接口扇救,該接口要求在請求中設置一個username頭部滑频,用于身份鑒權。

@FeignClient(name = "kafka-client", url = "http://kafka.xxx.com")
public interface KafkaClient {

    @GetMapping(value = "/api/clusterManager/listTopics")
    @Headers( {"cache-control: no-cache", "username: wangyong@xxx.com"})
    TopicsResponse listTopics(@RequestParam("clusterName") String clusterName,
                              @RequestParam("clusterArea") String clusterArea);
}

代碼寫好好荷愕,嘗試去進行訪問,確拋出如下錯誤信息:

{
    "timestamp": 1551768926170,
    "status": 500,
    "error": "Internal Server Error",
    "exception": "com.netflix.zuul.exception.ZuulException",
    "message": "pre:AuthAccessFilter"
}

異常堆棧信息如下:

    at feign.FeignException.errorStatus(FeignException.java:62)
    at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:91)
    at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:134)
    at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:76)
    at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:103)
    at com.sun.proxy.$Proxy147.listTopics(Unknown Source)
    at com.yidian.data.exptmgr.controller.KafkaController.getKafkaTopics(KafkaController.java:35)
    // 省略更多異常堆棧信息

于是我嘗試通過debug來找到問題的根源棍矛,通過debug我發(fā)現(xiàn)feign會先將請求參數(shù)構建成Request對象安疗,request信息如下:


request

從圖中可看到,該Request實例的headers屬性為空够委,而Request又是根據(jù)RequestTemplate模板對象生成的荐类,RequestTemplate實例信息如下:

RequestTemplate

到這里可以看出,問題是出在RequestTemplate的構建構成中茁帽,于是我就去跟蹤RequestTemplate構建的代碼玉罐,發(fā)現(xiàn)RequestTemplate是根據(jù)MethodMetadata構建而成,而MethodMetadata就是對方法配置的抽象潘拨。

    RequestTemplate template = resolve(argv, mutable, varBuilder);
      if (metadata.queryMapIndex() != null) {
        // add query map parameters after initial resolve so that they take
        // precedence over any predefined values
        template = addQueryMapQueryParameters(argv, template);
      }

      if (metadata.headerMapIndex() != null) {
        template = addHeaderMapHeaders(argv, template);
      }

從上述代碼可以看到吊输,header的設置是由metadata的headerMapIndex 屬性決定的,那么铁追,設置headerMapIndex的位置季蚂,必然就和Header的解析相關,于是通過查看方法引用,我找到了下面的代碼:

    private void parseHeaders(MethodMetadata md, Method method,
            RequestMapping annotation) {
        // TODO: only supports one header value per key
        if (annotation.headers() != null && annotation.headers().length > 0) {
            for (String header : annotation.headers()) {
                int index = header.indexOf('=');
                if (!header.contains("!=") && index >= 0) {
                    md.template().header(resolve(header.substring(0, index)),
                        resolve(header.substring(index + 1).trim()));
                }
            }
        }
    }

從代碼中我們可以清晰的看到扭屁,解析過程中是從@RequestMapping或其派生注解的header屬性中解析Header的算谈,并且Header的key和value需要用“=”進行分割。
于是我修改成下面的形式料滥,問題就解決了:

    @GetMapping(value = "/api/clusterManager/listTopics",
        headers = {"cache-control=no-cache", "username=wangyong@xxx.com"})
    TopicsResponse listTopics(@RequestParam("clusterName") String clusterName,
                              @RequestParam("clusterArea") String clusterArea);
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末然眼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子幔欧,更是在濱河造成了極大的恐慌罪治,老刑警劉巖丽声,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件礁蔗,死亡現(xiàn)場離奇詭異,居然都是意外死亡雁社,警方通過查閱死者的電腦和手機浴井,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來霉撵,“玉大人磺浙,你說我怎么就攤上這事⊥狡拢” “怎么了撕氧?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長喇完。 經(jīng)常有香客問我伦泥,道長,這世上最難降的妖魔是什么锦溪? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任不脯,我火速辦了婚禮,結果婚禮上刻诊,老公的妹妹穿的比我還像新娘防楷。我一直安慰自己,他們只是感情好则涯,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布复局。 她就那樣靜靜地躺著,像睡著了一般粟判。 火紅的嫁衣襯著肌膚如雪亿昏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天浮入,我揣著相機與錄音龙优,去河邊找鬼。 笑死,一個胖子當著我的面吹牛彤断,可吹牛的內容都是我干的野舶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宰衙,長吁一口氣:“原來是場噩夢啊……” “哼平道!你這毒婦竟也來了?” 一聲冷哼從身側響起供炼,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤一屋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后袋哼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體冀墨,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年涛贯,在試婚紗的時候發(fā)現(xiàn)自己被綠了诽嘉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡弟翘,死狀恐怖虫腋,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情稀余,我是刑警寧澤悦冀,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站睛琳,受9級特大地震影響盒蟆,放射性物質發(fā)生泄漏。R本人自食惡果不足惜掸掏,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一茁影、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧丧凤,春花似錦募闲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至仍侥,卻和暖如春要出,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背农渊。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工患蹂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓传于,卻偏偏與公主長得像囱挑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子沼溜,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容

  • ?通過前面兩章對Spring Cloud Ribbon和Spring Cloud Hystrix的介紹平挑,我們已經(jīng)掌...
    Chandler_玨瑜閱讀 213,111評論 15 140
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,103評論 1 32
  • 參考文檔 https://www.linuxidc.com/Linux/2017-09/146760.htmhtt...
    三杯水Plus閱讀 4,298評論 0 8
  • 兩天的休息日被硬生生占去一天,說什么都很不愿意系草。 好的管理者是什么通熄?有一步一個腳印的前進發(fā)展,也有潛心深入一線獲取...
    北山有佳人閱讀 231評論 0 0
  • 周二 已經(jīng)周二了找都,離考試又進了一步唇辨,原本自己想的挺好的,馬上就要考試了檐嚣,也就不給子皓太大的壓力助泽,不用做太...
    林子皓媽媽閱讀 207評論 0 0