null 요청 또는 응답으로 grpc 호출을 정의 할 수 있습니까?


117

proto3의 rpc 구문이 null 요청 또는 응답을 허용합니까?

예를 들어 다음과 같은 것을 원합니다.

rpc Logout;
rpc Status returns (Status);
rpc Log (LogData);

아니면 그냥 null 유형을 만들어야합니까?

message Null {};

rpc Logout (Null) returns (Null);
rpc Status (Null) returns (Status);
rpc Log (LogData) returns (Null);

답변:


164

아래 Kenton의 의견은 건전한 조언입니다.

... 개발자로서 우리는 미래에 우리가 원하는 것이 무엇인지 추측하는 데 정말 나쁩니다. 따라서 비어있는 경우에도 모든 메서드에 대해 항상 사용자 지정 매개 변수와 결과 유형을 정의하여 안전 할 것을 권장합니다.


내 질문에 답하기 :

기본 proto 파일을 살펴보면 위에서 제안한 Null 유형과 똑같은 Empty를 발견 했습니다. :)

해당 파일에서 발췌 :

// A generic empty message that you can re-use to avoid defining duplicated
// empty messages in your APIs. A typical example is to use it as the request
// or the response type of an API method. For instance:
//
//     service Foo {
//       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
//     }
//

message Empty {

}

33
예. 비어 있음은 표준 "I do n't care"요청 또는 응답입니다. 나중에 인수를 원하거나 값을 반환 할 있다고 생각되면 필드가없는 새 메시지를 만드십시오. 이렇게하면 필요할 때 새 필드를 추가하고 애플리케이션 코드를 중단하지 않을 수 있습니다. Empty는 인수 또는 반환 값을 원하지 않을 때 유용합니다.
Eric Anderson

40
@EricAnderson이 대부분 옳지 만, 우리는 개발자로서 미래에 우리가 무엇을 원하는지 추측하는 데 정말 나쁘다고 주장합니다 . 따라서 비어있는 경우에도 모든 메서드에 대해 항상 사용자 지정 매개 변수와 결과 유형을 정의하여 안전 할 것을 권장합니다.
Kenton Varda

1
"... 개발자로서 우리는 미래에 우리가 원하는 것이 무엇인지 추측하는 데 정말 나쁩니다.", 이것은 Empty각 개별 함수 호출에 대해 별도의 메시지를 요구할까요? 그것은 상당한 희생입니다.
Robert de W

29

미리 정의 된 다음을 사용할 수도 있습니다.

import "google/protobuf/empty.proto";
package MyPackage;

service MyService {
  rpc Check(google.protobuf.Empty) returns (google.protobuf.Empty) {}
}

0

Reply 구조 내에서 다른 bool 속성을 사용할 수도 있습니다. 이렇게

message Reply {
  string result = 1;
  bool found = 2;
}

따라서 결과를 찾지 못하거나 오류가 발생한 경우 서비스 클래스에서 반환 할 수 있습니다.

return new Reply()
{
   Found = false
};
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.