【问题标题】:GRPC call for a service which is inside a subdirectory? (Android grpc client)GRPC 调用子目录内的服务? (安卓grpc客户端)
【发布时间】:2022-10-13 04:39:44
【问题描述】:

这个问题与下面类似,但我的问题是 Android grpc 客户端 How can I make a GRPC call for a service which is inside a subdirectory? (in .Net Framework)

访问 grpc 流 api 时出现 404 以下错误:

UNIMPLEMENTED: HTTP status code 404
    invalid content-type: text/html
    headers: Metadata(:status=404,content-length=1245,content-type=text/html,server=Microsoft-IIS/10.0,request-id=5154500d-fb58-7903-65d6-3d3711129101,strict-transport-security=max-age=31536000; includeSubDomains; preload,alt-svc=h3=":443",h3-29=":443",x-preferredroutingkeydiagnostics=1,x-calculatedfetarget=PS2PR02CU003.internal.outlook.com,x-backendhttpstatus=404,x-calculatedbetarget=PUZP153MB0788.APCP153.PROD.OUTLOOK.COM,x-backendhttpstatus=404,x-rum-validated=1,x-proxy-routingcorrectness=1,x-proxy-backendserverstatus=404,x-feproxyinfo=MA0PR01CA0051.INDPRD01.PROD.OUTLOOK.COM,x-feefzinfo=MAA,ms-cv=DVBUUVj7A3ll1j03ERKRAQ.1.1,x-feserver=PS2PR02CA0054,x-firsthopcafeefz=MAA,x-powered-by=ASP.NET,x-feserver=MA0PR01CA0051,date=Tue, 11 Oct 2022 06:24:18 GMT)

这是我用来在 android 中创建 grpc 通道的代码(给出 404)

   val uri =  Uri.parse("https://examplegrpcserver.com/subdirectory_path")
    private val channel = let {
        val builder = ManagedChannelBuilder.forTarget(uri.host+uri.path)
        if (uri.scheme == "https") {
            builder.useTransportSecurity()
        } else {
            builder.usePlaintext()
        }
        builder.executor(Dispatchers.IO.asExecutor()).build()
    }

uri 是正确的,因为它适用于 Web 客户端。 对于 Web 客户端,通道是这样定义的(工作)

 var handler = new SubdirectoryHandler(httpHandler, "/subdirectory_path");
            var userToken = "<token string>";

            var grpcWebHandler = new GrpcWebHandler(handler);

            using var channel = GrpcChannel.ForAddress("https://examplegrpcserver.com", new GrpcChannelOptions { HttpHandler = grpcWebHandler,
                Credentials = ChannelCredentials.Create(new SslCredentials(), CallCredentials.FromInterceptor((context, metadata) =>
                {
                    metadata.Add("Authorization", $"Bearer {userToken}");
                    return Task.CompletedTask;
                }))
            });

问题是 /subdirectory_path 在最终的传出调用中被服务忽略,因为我没有使用像 web.xml 这样的显式子目录处理程序。

我无法在 android 中将“GrpcChannelOptions”添加到我的频道,因为 android grpc 库没有这样的方法。

有人可以帮我解决这个问题吗,如何在定义频道时添加子目录处理程序?

【问题讨论】:

    标签: grpc subdirectory grpc-java grpc-web grpc-kotlin


    【解决方案1】:

    RPC 的路径由.proto 定义固定。不支持向路径添加前缀。

    传递给forTarget() 的 URI 指向包含地址连接到。所以完全限定的形式通常是dns:///example.com 的形式。如果您在 URI 中指定了一个主机,例如 dns://1.1.1.1/example.com,那么这将意味着“在 DNS 服务器 1.1.1.1 上查找 example.com”。但是没有地方可以在目标字符串中放置路径前缀,因为该路径仅用于地址查找,而不是实际的 RPC。

    如果 Web 客户端支持路径前缀,那是它特有的功能。它还将使用经过调整的 grpc 协议,该协议需要转换为普通后端。

    【讨论】:

      猜你喜欢
      • 2021-04-10
      • 2020-11-20
      • 2020-09-09
      • 2020-10-18
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多