首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Go中的gRPC服务器与Python中的客户端之间的兼容性

Go中的gRPC服务器与Python中的客户端之间的兼容性
EN

Stack Overflow用户
提问于 2018-06-25 02:25:22
回答 1查看 738关注 0票数 2

我想知道Go中的gRPC服务和Python中的客户端的兼容性。

例如if the service is implemented in Go,它会有这样的签名:

代码语言:javascript
复制
...

func (s *routeGuideServer) GetFeature(ctx context.Context, point *pb.Point) (*pb.Feature, error) {
        ...
}
...

func (s *routeGuideServer) ListFeatures(rect *pb.Rectangle, stream pb.RouteGuide_ListFeaturesServer) error {
        ...
}
...

func (s *routeGuideServer) RecordRoute(stream pb.RouteGuide_RecordRouteServer) error {
        ...
}
...

func (s *routeGuideServer) RouteChat(stream pb.RouteGuide_RouteChatServer) error {
        ...
}

注意error对象是如何返回的。

现在,如果我必须使用implement the client in Python it will be something like this

代码语言:javascript
复制
feature = stub.GetFeature(point)
for received_route_note in stub.RouteChat(sent_route_note_iterator):

Go服务实现返回的error字段会发生什么情况?如果存在来自服务器端的错误,如何在Python客户端中处理它?

EN

回答 1

Stack Overflow用户

发布于 2018-06-25 04:31:58

gRPC提供了适合所用语言的错误处理。

正如您所提到的,在Go server中返回一个错误:

代码语言:javascript
复制
func (s *routeGuideServer) RouteChat(stream pb.RouteGuide_RouteChatServer) error {
for {
    in, err := stream.Recv()
    if err == io.EOF {
        return nil
    }
    if err != nil {
        return err
    }
    ...

在Python客户端中,您在try语句中执行API调用(人为设计的示例,因为官方文档没有说明这一点):

代码语言:javascript
复制
while True:
  try:
    received_route_note = stub.RouteChat(sent_route_note_iterator)
  except grpc.Error as e:
    print(e.details())
    break

相反,在Python服务器中,您可以设置上下文,并可选地引发异常:

Python Generated Code Reference中的

  • 示例:

context.set_code(grpc.StatusCode.UNIMPLEMENTED) TellFortune(self,request,context):“返回给定月份和日期的星座和星座。错误:无效的月或日,财富不可用”“context.set_code(grpc.StatusCode.UNIMPLEMENTED)context.set_details(‘方法未实现!’)从implemented!')

context.set_code(grpc.StatusCode.INVALID_ARGUMENT) UnUn(self,request,context):if _application_common.UNARY_UNARY_REQUEST == request: return _application_common.UNARY_UNARY_RESPONSE else: def context.set_details(‘你的请求有问题!’)返回services_pb2.Down()

Go client中,error对象是结果参数之一:

代码语言:javascript
复制
stream, err := client.RouteChat(ctx)
if err != nil {
    log.Fatalf("%v.RouteChat(_) = _, %v", client, err)
}

不幸的是,官方文档似乎没有明确地涵盖错误处理实践。

我在http://avi.im/grpc-errors/找到了一个很好的第三方参考资料

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51012776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档