gRPC請求中對header進行處理

gRPC請求設置header(Android红符、iOS、JavaServer)

1.[Android (Java)]

1.1只設置客戶端請求時附帶的header

見類 io.grpc.stub.MetadataUtils毅整,其中有個方法:

  /**
   * Attaches a set of request headers to a stub.
   *
   * @param stub to bind the headers to.
   * @param extraHeaders the headers to be passed by each call on the returned stub.
   * @return an implementation of the stub with {@code extraHeaders} bound to each call.
   */
  @ExperimentalApi("https://github.com/grpc/grpc-java/issues/1789")
  public static <T extends AbstractStub<T>> T attachHeaders(
      T stub,
      final Metadata extraHeaders) {
    return stub.withInterceptors(newAttachHeadersInterceptor(extraHeaders));
  }

稍微自己封裝一下的效果,如下:

    private static <T extends AbstractStub<T>> T attachHeaders(T stub, final Map<String, String> headerMap) {
        Metadata extraHeaders = new Metadata();
        if (headerMap != null) {
            for (String key : headerMap.keySet()) {
                Metadata.Key<String> customHeadKey = Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER);
                extraHeaders.put(customHeadKey, headerMap.get(key));
            }
        }
        return MetadataUtils.attachHeaders(stub, extraHeaders);
    }

1.2 支持設置客戶端請求的header以及獲取服務端返回結果中的header

第一步:主要是設置http的攔截器ClientInterceptor绽左,攔截器類大概實現(xiàn)代碼如下:


/**
 * A interceptor to handle client header.
 *
 * @author Kido
 * @email everlastxgb@gmail.com
 * @create_time 2016/7/7 11:02
 */

class HeaderClientInterceptor implements ClientInterceptor {

    private static final String TAG = "HeaderClientInterceptor";

    private Map<String, String> mHeaderMap;

    public HeaderClientInterceptor(Map<String, String> headerMap) {
        mHeaderMap = headerMap;
    }

    @Override
    public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(MethodDescriptor<ReqT, RespT> method,
                                                               CallOptions callOptions, Channel next) {
        return new SimpleForwardingClientCall<ReqT, RespT>(next.newCall(method, callOptions)) {

            @Override
            public void start(Listener<RespT> responseListener, Metadata headers) {
                /* put custom header */
                if (mHeaderMap != null) {
                    for (String key : mHeaderMap.keySet()) {
                        Metadata.Key<String> customHeadKey = Metadata.Key.of(key, Metadata.ASCII_STRING_MARSHALLER);
                        headers.put(customHeadKey, mHeaderMap.get(key));
                    }
                }
                Logger.i(TAG, "header send to server:" + headers);
                super.start(new SimpleForwardingClientCallListener<RespT>(responseListener) {
                    @Override
                    public void onHeaders(Metadata headers) {
                        /**
                         * if you don't need receive header from server,
                         * you can use {@link io.grpc.stub.MetadataUtils attachHeaders}
                         * directly to send header
                         */
                        Logger.i(TAG, "header received from server:" + headers);
                        super.onHeaders(headers);
                    }
                }, headers);
            }
        };
    }
}

第二步:大概使用代碼如下:

Map<String, String> headerMap = new HashMap<>();
//...
ClientInterceptor interceptor = new HeaderClientInterceptor(headerMap);
//...
ManagedChannel managedChannel = ManagedChannelBuilder.forAddress(host, port).usePlaintext(true).build();
Channel channel = ClientInterceptors.intercept(managedChannel, interceptor);

// then create stub here by this channel

2. [iOS (Objective-C)]

首先悼嫉,可以看到GRPCCall中有如下屬性:

@property(atomic, readonly) NSDictionary *responseHeaders;
@property(atomic, readonly) NSDictionary *responseTrailers;

接著,可以進行如下設置:

call.requestHeaders[@"My-Header"] = @"Value for this header";
call.requestHeaders[@"Another-Header"] = @"Its value";

3.[Server (Java)]

既然是Java拼窥,實現(xiàn)方式應該也和上述Android大概一樣戏蔑。
第一步:攔截器

/**
 * A interceptor to handle server header.
 */
public class HeaderServerInterceptor implements ServerInterceptor {

  private static final Logger logger = Logger.getLogger(HeaderServerInterceptor.class.getName());

  private static Metadata.Key<String> customHeadKey =
      Metadata.Key.of("custom_server_header_key", Metadata.ASCII_STRING_MARSHALLER);


  @Override
  public <ReqT, RespT> ServerCall.Listener<ReqT> interceptCall(
      ServerCall<ReqT, RespT> call,
      final Metadata requestHeaders,
      ServerCallHandler<ReqT, RespT> next) {
    logger.info("header received from client:" + requestHeaders);
    return next.startCall(new SimpleForwardingServerCall<ReqT, RespT>(call) {
      @Override
      public void sendHeaders(Metadata responseHeaders) {
        responseHeaders.put(customHeadKey, "customRespondValue");
        super.sendHeaders(responseHeaders);
      }
    }, requestHeaders);
  }
}

第二步:使用示例

//...
Server server = ServerBuilder.forPort(port)
  .addService(ServerInterceptors.intercept(new GreeterImpl(), new HeaderServerInterceptor()))
  .build()
  .start();
//...
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鲁纠,隨后出現(xiàn)的幾起案子总棵,更是在濱河造成了極大的恐慌,老刑警劉巖改含,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件情龄,死亡現(xiàn)場離奇詭異,居然都是意外死亡捍壤,警方通過查閱死者的電腦和手機骤视,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鹃觉,“玉大人专酗,你說我怎么就攤上這事〉辽龋” “怎么了祷肯?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長粱玲。 經(jīng)常有香客問我躬柬,道長,這世上最難降的妖魔是什么抽减? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任允青,我火速辦了婚禮,結果婚禮上卵沉,老公的妹妹穿的比我還像新娘颠锉。我一直安慰自己,他們只是感情好史汗,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布琼掠。 她就那樣靜靜地躺著,像睡著了一般停撞。 火紅的嫁衣襯著肌膚如雪瓷蛙。 梳的紋絲不亂的頭發(fā)上悼瓮,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機與錄音艰猬,去河邊找鬼横堡。 笑死,一個胖子當著我的面吹牛冠桃,可吹牛的內(nèi)容都是我干的命贴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼食听,長吁一口氣:“原來是場噩夢啊……” “哼胸蛛!你這毒婦竟也來了?” 一聲冷哼從身側響起樱报,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤葬项,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后迹蛤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玷室,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年笤受,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敌蜂。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡箩兽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出章喉,到底是詐尸還是另有隱情汗贫,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布秸脱,位于F島的核電站落包,受9級特大地震影響,放射性物質發(fā)生泄漏摊唇。R本人自食惡果不足惜咐蝇,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望巷查。 院中可真熱鬧有序,春花似錦、人聲如沸岛请。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽崇败。三九已至盅称,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缩膝。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工混狠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人逞盆。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓檀蹋,卻偏偏與公主長得像,于是被迫代替她去往敵國和親云芦。 傳聞我的和親對象是個殘疾皇子俯逾,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,185評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)舅逸,斷路器桌肴,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • 耶穌在最后的晚餐上跟他的門徒說,“面包是我的肉琉历,葡萄酒是我的血”坠七。這句話一點也不陌生吧! 約翰福音里也有記載旗笔,耶穌...
    夏天YJ閱讀 5,809評論 2 4
  • 不知不覺又是一個月彪置,一忙起來就難以有靈感來寫寫東西。但終歸需要總結一下蝇恶,把這一個月所經(jīng)歷的事給記錄下來拳魁。而這個月主...
    JJJJJJ99閱讀 3,289評論 1 6
  • 當代學生和老師有沖突贿衍,屢見不鮮授舟。“攜程親子園”的塵埃還沒有落定贸辈,又爆出湖南沅江三中的高三學生羅某用刀殺死班主任鮑方...
    西山舊事閱讀 521評論 1 0