2017-03-14 5 views
0

현재 GRPC-Java에서 CallCredentials를 사용하지 않습니다. 특정 호출에 대해 헤더의 여러 필드를 전달해야합니다. 아래에 주어진대로 헤더를 채우고 비동기 스텁/채널을 사용하면서 호출되는 인터셉터를 추가했습니다.grpc java 클라이언트 요청에 대한 헤더 채우기

채우기 헤더

public Metadata generateHeader() { 
    Metadata.Key<String> jwtKey = Metadata.Key.of("jwt", Metadata.ASCII_STRING_MARSHALLER); 
    headers.put(jwtKey, jwt); 
    Metadata.Key<String> testKey = Metadata.Key.of("testID", Metadata.ASCII_STRING_MARSHALLER); 
    headers.put(testKey, testID); 
    return headers; 
} 

나는 클라이언트 요격에 전달 인스턴스 변수로 헤더 필드에 접근하고있다. 헤더가 원하는 값을 포함한다는 것을 알 수 있습니다. 시작 지점에 도달하면 null이됩니다 (서버 쪽에서 헤더가 채워지는 것은 분명하지 않습니다). 이 문제를 해결할 수있는 아이디어 (또는 CallCredentials를 사용해야합니까?) GRPC-Java 용 문서에는 많은 작업이 필요합니다.

@Override 
public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(
     MethodDescriptor<ReqT, RespT> method, 
     CallOptions callOptions, 
     Channel next) { 
    log.info("HEADER INTERCEPTOR{}", headers.get(Metadata.Key.of("jwt", Metadata.ASCII_STRING_MARSHALLER))); 
    ClientCall<ReqT, RespT> call = next.newCall(method, callOptions); 
    return new ForwardingClientCall.SimpleForwardingClientCall<ReqT, RespT>(call) { 
     @Override 
     public void start(ClientCall.Listener<RespT> responseListener, Metadata headers) { 
      log.info("HEADER START {}", headers.keys()); 
      super.start(responseListener, headers); 
     } 
    }; 
} 

답변

-1

메서드 호출을 통해 헤더에 액세스해야만 헤더 키/값을 가져올 수있었습니다.

Metadata cached = getHeaders().get(Metadata.Key.of("testID", Metadata.ASCII_STRING_MARSHALLER))); 
headers.merge(cached); 

&

public Metadata getHeaders() { 
     return headers; 
} 
+0

당신은 나에게 수정 프로그램을 공유 할 수 있습니까? – rana

+0

그 대답에 위. –

+0

이 코드는 어디에 있습니까? 답변을 명확하게 업데이트 해 주시겠습니까? === 캐시 된 메타 데이터 = getHeaders(). get (Metadata.Key.of ("testID", Metadata.ASCII_STRING_MARSHALLER)))); headers.merge (캐싱 됨); – rana