gRPC does not return a boolean value if the value is false

PHPz
Release: 2024-02-10 09:30:09
forward
399 people have browsed it

如果值为 false,gRPC 不会返回布尔值

When php editor Baicao introduced the use of gRPC, he pointed out that if the specified value is false in the gRPC request, then gRPC will not return a Boolean value. This means that when using gRPC, we need to pay attention to how return values are handled to avoid confusion and errors. Understanding this detail will help us better understand and apply the functions of gRPC, and improve our programming efficiency and code quality. Let's delve into more features and usage of gRPC to bring better performance and scalability to our projects.

Question content

func (m *todoserver) gettodos(ctx context.context, empty *emptypb.empty) (*desc.gettodosresponse, error) { todos, err := m.todoservice.gettodos() if err != nil { return nil, err } todosresp := make([]*desc.gettodosresponse_todo, 0, len(todos)) for _, todo := range todos { todosresp = append(todosresp, &desc.gettodosresponse_todo{ id: todo.id, title: todo.title, iscompleted: todo.iscompleted, }) } return &desc.gettodosresponse{todos: todosresp}, nil }
Copy after login
service TodoService { rpc GetTodos(google.protobuf.Empty) returns (GetTodosResponse) {} } message GetTodosResponse { repeated Todo todos = 1; message Todo { int64 id = 1; string title = 2; bool is_completed = 3; } }
Copy after login
Copy after login
service TodoService { rpc GetTodos(google.protobuf.Empty) returns (GetTodosResponse) {} } message GetTodosResponse { repeated Todo todos = 1; message Todo { int64 id = 1; string title = 2; bool is_completed = 3; } }
Copy after login
Copy after login

I have a record in the database |Number |Title |Completed | |-|-|-| | 1 |Ahhh|False|

The above function returns{"todos": [{"id": "1", "title": "aaa"}]}But once I changeis_completedistrue, the result is correct{"todos ": [{"id": "1", "title": "aaa", "iscompleted": true}]}

Solution

This is by design and to improve efficiency.

The "zero" value of

boolisfalse- so when aprotobufstructure is initialized with afalsevalue, when using the standard This field does not need to be explicitly declared when using the library'sencoding/jsonunmarshaller. On the encoding side, if the field's json tag contains theomitemptyqualifier, the standard library'sencoding/jsonmarshaler will remove any zero values - this is what you see of. You will see the same behavior if thetitlestring field is""(i.e. the zero value of the string).

View the generated code (*.pb.go), theboolfield definition of the structure will be as follows:

type todo struct { // ... iscompleted bool `protobuf:"varint,5,opt,name=is_complete,proto3" json:"is_complete,omitempty"` }
Copy after login

Thusjson:"...,omitempty"instructs theencoding/jsonmarshaler to omit any zero values during marshaling using these tags.

If you want to override this behavior:

  • It is possible to remove theomitemptydirective from the generated code (not recommended - due to the need to manage editing during the development life cycle). But if you must do this, seethis answer;
  • If usinggrpc-gateway, please override it at runtime, for example
gwmux := runtime.newservemux(runtime.withmarshaleroption(runtime.mimewildcard, &runtime.jsonpb{origname: true, emitdefaults: true}))
Copy after login
  • Or, if you export json yourself, instead of using the standard library (encoding/json), use thejsonmarshaler" in this package google.golang.org/protobuf/encoding/protojson":
protojson.Marshaler{EmitDefaults: true}.Marshal(w, resp)
Copy after login

As mentioned inthis answer.

The above is the detailed content of gRPC does not return a boolean value if the value is false. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!