[email protected] who will be able to contribute more on the protocol buffers side of the discussion
On Mon, Nov 21, 2016 at 2:48 PM, Jesús García Crespo <[email protected]> wrote: > First, I would like to say thanks to all of you for the great job! > Aww, you're very welcome! > I'm trying to wire two Python apps using grpcio 1.0.1. In the scenario > that I'm going to describe below, the client asks for a determined book and > the server wants to communicate that the book has not ben found. What would > be the current way to do that with the following proto? > > service Library { > rpc BookGet(BookGetRequest) returns (BookGetResponse) > } > > message Book { > string id = 1; > } > > message BookGetRequest { > string id = 1; > } > > message BookGetResponse { > Book book = 1; > } > I think the problem here is that the way your messages model your data doesn't allow for you to represent "no book was found" as a first-class concept. You could fake it with a sentinel value for the id of the not-really-found found Book (the empty string, or the string "this id represents a book not having been found", or something else), but I suspect that the first-class thing to do would be for BookGetResponse to have a more complicated type <https://en.wikipedia.org/wiki/Algebraic_data_type> for its internal field - possibly a oneof <https://developers.google.com/protocol-buffers/docs/proto#using-oneof> that can communicate exactly one of the id of a found book or the fact that the book was not found. I've tried the following snippet but it won't work because I can't return > `None` or the channel will fail to serialize the response: > > class LibraryServer(object): > def BookGet(self, request, context): > """ Book not found. """ > context.set_code(grpc.StatusCode.NOT_FOUND) > Yep <https://github.com/grpc/grpc/issues/8672>. I go back and forth on how and whether that should be made to work. If I return an empty message *and* set the status code to NOT_FOUND then I > see an internal exception (message = "_Rendezvous of RPC that terminated > with (StatusCode.NOT_FOUND, )") is raised on the client side: > > class LibraryServer(object): > def BookGet(self, request, context): > """ Book not found. """ > context.set_code(grpc.StatusCode.NOT_FOUND) > Non-OK status codes always cause exceptions to be raised on the invocation side of an RPC. If you like you can incorporate that into the semantics of your application-level protocol but I advise against it because it strikes me as likely to make actual gRPC-level errors more difficult to handle. I've also attempted these two approaches: > > class LibraryServer(object): > def BookGet(self, request, context): > """ Book not found. """ > return library_mcp2.BookGetResponse() > > class LibraryServer(object): > def BookGet(self, request, context): > """ Book not found. """ > return library_mcp2.BookGetResponse(book=None) > > However, this is what I am seeing on the client: > > resp = self.stub.BookGet(library_pb2.BookGetRequest(id='12345')) > resp is None # False > resp.book is None # False > resp.book.id is None # False > resp.book.id == '' # True > > So I could only make use of the last assertion but that seems far from > ideal, right? > I think this has to do with the changes in Protocol Buffers 3 and how fields and messages are never "not present" any more. What am I doing wrong? > Probably nothing is wrong in the strictest sense; I think it's more a matter of shaping your messages so that they more clearly and more readily reflect the semantics of your application-level protocol. Thank you for your help! > Thank you for writing! -N -- You received this message because you are subscribed to the Google Groups "grpc.io" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/grpc-io. To view this discussion on the web visit https://groups.google.com/d/msgid/grpc-io/CAEOYnAQVTqRCOG3OrHYdoo4ttMk9iQDKtv8dkzJH5i81wdkbgQ%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
smime.p7s
Description: S/MIME Cryptographic Signature
