gRPC请求中对header进行处理
2016-08-07 13:12
176 查看
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,拦截器类大概实现代码如下:/** * 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,实现方式应该也和上述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(); //...
相关文章推荐
- Android network:主线程将创建请求放入(请求)队列,处理线程每次取一个请求,进行处理(发送/读响应)
- java发送url请求进行文件的提交以及后台struts2的action接收处理
- iOS---对AFNetworking进行二次封装,使用单例单独处理网络请求数据
- 反射:修改请求头HttpWebRequest/Webclient Header属性的date值-"此标头必须使用适当的属性进行修改"
- 在 JS 中使用 fetch 更加高效地进行网络请求(二),这一篇更多的是坑的处理
- 在ASP.NET 2.0中,有时候需要对ASP.NET生成的HTML代码进行处理,或者是保存成静态文件。ASP.NET 提供了直接将请求保存成文件的方法:HttpRequest.SaveAs方法。下面这个方法就是在ASP.NET 2.0中得到ASP.NET
- Axios数据请求post与node进行传参,node中处理json
- Volley进行GET请求,需要Header的解决办法
- C# winform端 通过HttpWebRequest进行post和get请求,数据格式为json,后台java端接收,其中有关传输特殊字符(\t,\r,',\n,n)等处理
- ajax请求二进制流进行处理(ajax异步下载文件)
- 如何让php对页面的缓存进行控制 php处理请求的浏览器缓存处理
- (微信API接口开发) 使用HttpWebRequest进行请求时发生错误:基础连接已关闭,发送时发生错误处理
- 使用HttpWebRequest进行请求时发生错误:基础连接已关闭,发送时发生错误处理
- java发送url请求进行文件的提交以及后台struts2的action接收处理
- 使用HttpWebRequest进行请求时发生错误:基础连接已关闭,发送时发生错误处理
- 实现对现有的aspx请求进行异步队列控制处理
- Self Host模式下的ASP. NET Web API是如何进行请求的监听与处理的?
- 用HttpPost登陆验证时,用户名和密码放在请求头部header中的处理方法,形式为Authorization: username password。
- 对put,delete的restful请求进行过滤处理的工具类
- ajax实战:(ajax异步下载文件)请求二进制流进行处理