gRPC服务器错误处理程序golang

huangapple go评论97阅读模式
英文:

gRPC server error handler golang

问题

我想了解关于使用golang、gRPC和protobuf的最佳实践。

我正在实现以下gRPC服务:

service MyService {
   rpc dosomethink(model.MyModel) returns (model.Model) {
     option (google.api.http) = { post: "/my/path" body: "" };
   }
}

我已经编译了protobuf。实际上,protobuf为我们提供了一个从HTTP到gRPC的httpproxy。

实现此服务的代码如下:

import "google.golang.org/grpc/status"

func (Abcd) Dosomethink(c context.Context, sessionRequest *model.MyModel) (*model.Model, error) {
   return nil, status.New(400, "Default error message for 400")
}

我希望在HTTP代理中返回一个400的HTTP错误,错误消息为"Default error message for 400",消息是有效的,但是HTTP错误始终是500。

你知道有关此问题的任何文章或文档吗?

英文:

I want know about good practices with golang and gRPC and protobuf.

I am implementing the following gRPC service

service MyService {
   rpc dosomethink(model.MyModel) returns (model.Model) {
     option (google.api.http) = { post: "/my/path" body: "" };
   }
}

I compiled the protobufs. In fact, the protobuf give us a httpproxy from http to grpc.

The code to implement this service:

import "google.golang.org/grpc/status"

func (Abcd) Dosomethink(c context.Context, sessionRequest *model.MyModel) (*model.Model, error) {

   return nil, status.New(400,"Default error message for 400")
}

I want a 400 http error (in the http proxy) with the message "Default error message for 400", the message works, but the http error always is 500.

Do you know any post or doc about this?

答案1

得分: 11

你需要返回一个空的model.Model对象,以便能够正确序列化消息。

尝试使用以下代码:

import "google.golang.org/grpc/status"

func (Abcd) Dosomethink(c context.Context, sessionRequest *model.MyModel) (*model.Model, error) {
   return &model.Model{}, status.Error(400, "Default error message for 400")
}
英文:

You need to return empty model.Model object in order for protobufs to be able to properly serialise the message.

Try

import "google.golang.org/grpc/status"

func (Abcd) Dosomethink(c context.Context, sessionRequest *model.MyModel) (*model.Model, error) {

   return &model.Model{}, status.Error(400,"Default error message for 400")
}

答案2

得分: 11

错误处理程序:

import (
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
)

...

return data, status.Errorf(
	codes.InvalidArgument,
	fmt.Sprintf("您的消息", req.data),
)

如果需要更多关于错误处理的信息,请查看以下链接:

https://grpc.io/docs/guides/error.html

http://avi.im/grpc-errors/

英文:

Error Handler:

"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
return data, status.Errorf(
			codes.InvalidArgument,
			fmt.Sprintf("Your message", req.data),
		)

For need more info about the error handling take a look below links.

https://grpc.io/docs/guides/error.html

http://avi.im/grpc-errors/

huangapple
  • 本文由 发表于 2017年8月2日 16:13:15
  • 转载请务必保留本文链接:https://go.coder-hub.com/45455144.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定