溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ProtoBuf gRPC分析請求頭怎么配置

發(fā)布時間:2022-03-21 16:42:48 來源:億速云 閱讀:503 作者:iii 欄目:大數(shù)據(jù)

今天小編給大家分享一下ProtoBuf gRPC分析請求頭怎么配置的相關(guān)知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

ProtoBuf + gRPC 分析請求頭

概念

Protobuf是Google protocol buffer的簡稱,是一種語言中立、平臺無關(guān)、易于擴展的結(jié)構(gòu)化數(shù)據(jù)序列化技術(shù),可用于數(shù)據(jù)傳輸、存儲等領(lǐng)域。 與Protoful類似的序列化技術(shù)還有XML、JSON、Thrift等,但Protoful更快、更小、更簡單,且具備良好的兼容性。

目前經(jīng)常運用在 安卓直播彈幕等業(yè)務(wù)場景中

配置請求頭

方法1

只設(shè)置客戶端請求時附帶的header

類 io.grpc.stub.MetadataUtils,其中有個方法

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

**<br>自己封裝后

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

**

方法2

支持設(shè)置客戶端請求的header以及獲取服務(wù)端返回結(jié)果中的header

  • 官方demo

  • 官方完整Demo

1. 設(shè)置攔截器

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

_

2. 使用

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

**

所以

要實現(xiàn)添加header 那么必須實現(xiàn) ClientInterceptor 接口類中的 interceptCall 的方法

  • 而且還要有一個 添加Header的具體方法

  • 不管 grpc 怎么混淆都離不開這種配置模式

例如這種<br>ProtoBuf gRPC分析請求頭怎么配置注意他們的類型,很明顯這種情況可以快速推論

  • z1.c.v.p.a.d.b.f.a.a() 大概率就是混淆后的 interceptCall

  • z1.c.v.p.a.d.b.f.a.c() 是添加請求頭的函數(shù)

以上就是“ProtoBuf gRPC分析請求頭怎么配置”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI