Heim  >  Artikel  >  Backend-Entwicklung  >  gRPC gibt keinen booleschen Wert zurück, wenn der Wert falsch ist

gRPC gibt keinen booleschen Wert zurück, wenn der Wert falsch ist

PHPz
PHPznach vorne
2024-02-10 09:30:09461Durchsuche

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

php-Editor Baicao wies bei der Einführung der Verwendung von gRPC darauf hin, dass gRPC keinen booleschen Wert zurückgibt, wenn der angegebene Wert in der gRPC-Anfrage falsch ist. Das bedeutet, dass wir bei der Verwendung von gRPC darauf achten müssen, wie mit Rückgabewerten umgegangen wird, um Verwirrung und Fehler zu vermeiden. Das Verständnis dieser Details wird uns helfen, die Funktionen von gRPC besser zu verstehen und anzuwenden sowie unsere Programmiereffizienz und Codequalität zu verbessern. Schauen wir uns weitere Funktionen und die Verwendung von gRPC an, um die Leistung und Skalierbarkeit unserer Projekte zu verbessern.

Frageninhalt

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
}
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;
    }
}
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;
    }
}

Ich habe einen Eintrag in der Datenbank |Nummer |Titel |Abgeschlossen | |-|-|-| |. 1 |Ahhh|Falsch|

Die obige Funktion gibt {"todos": [{"id": "1", "title": "aaa"}]} 但一旦我将 is_completed 更改为 true ,结果是正确的 {"todos ": [{"id": "1", "title": "aaa", "iscompleted": true}]}

Solution

zurück. Dies ist beabsichtigt und soll die Effizienz verbessern.

bool 的“零”值是 false - 因此,当使用 false 值初始化 protobuf 结构时,在使用标准库的 encoding/json 解组器时不需要显式声明该字段。在编码端,如果字段的 json 标记包含 omitempty 限定符,则标准库的 encoding/json Der Marshaller entfernt alle Nullwerte – das sehen Sie. Sie werden das gleiche Verhalten sehen, wenn title 字符串字段是 "" (d. h. der Nullwert der Zeichenfolge).

Sehen Sie sich den generierten Code an (*.pb.go),结构体的 bool Die Felddefinitionen sehen folgendermaßen aus:

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

Deshalb json:"...,omitempty" 指示 encoding/json lässt der Marshaller beim Marshalling mithilfe dieser Tags alle Nullwerte aus.

Wenn Sie dieses Verhalten überschreiben möchten:

  • Es ist möglich, die omitempty-Direktive aus dem generierten Code zu entfernen (nicht empfohlen – da die Bearbeitung während des Entwicklungslebenszyklus verwaltet werden muss). Wenn Sie dies jedoch tun müssen, lesen Sie diese Antwort;
  • Wenn Sie grpc-gateway verwenden, überschreiben Sie es bitte zur Laufzeit, z. B.
gwmux := runtime.newservemux(runtime.withmarshaleroption(runtime.mimewildcard, &runtime.jsonpb{origname: true, emitdefaults: true}))
  • Oder, wenn Sie JSON selbst exportieren, ohne die Standardbibliothek zu verwenden (encoding/json),而是使用此包中的 json 封送拆收器 "google.golang.org/protobuf/encoding/protojson":
protojson.Marshaler{EmitDefaults: true}.Marshal(w, resp)

Wie in dieser Antwort erwähnt.

Das obige ist der detaillierte Inhalt vongRPC gibt keinen booleschen Wert zurück, wenn der Wert falsch ist. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen