GRPC调用子目录中的服务?(安卓grpc客户端)



这个问题类似于下面的问题,但我的问题是关于Android grpc客户端如何为子目录中的服务进行GRPC调用?(在.Net框架中(

我在访问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)

问题是/subdirectory_path在最后的传出呼叫中被服务忽略。这是我用来在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;
}))
});

我试图在我的android客户端的uri中注入subdirectory_path,但找不到合适的api。grpc-kotlin没有公开通道中使用的底层http客户端。

有人能帮我解决这个问题吗?我如何指定子目录路径?(在服务和方法名称之前(

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协议,该协议需要转换为正常后端。

最新更新