gRPC:如何通过静态和流参数的组合调用远程过程?

我正在尝试使用gRPC传输文件。我可以使用gRPC流发送破碎的数据。我正在寻找一种也可以与数据一起传输文件名的方法。我敢肯定有一个明显的解决方案我不见了。但我可以想到以下几种方法

  1. 向每个块发送文件名,这是重新传输相同数据的明显缺点。 .proto文件将类似于
service KeyValueStore {
    rpc upload (stream FileData) returns (UploadStatus) {}
}

message FileData {
    string filename = 1;
    bytes data = 2;
}
  1. 将文件名作为第一个块发送。接收者需要知道这种编码。

但是我正在寻找一种非骇客的解决方案。

我希望有一个类似的解决方案

service KeyValueStore {
    rpc upload (FileName,stream FileData) returns (UploadStatus) {}
}

但这是不可能的,并且根据答案here

通常,是否有一种更干净的方法来调用包含常规参数和流参数的组合的过程?或达到相同的效果?

twinsen_zx 回答:gRPC:如何通过静态和流参数的组合调用远程过程?

您链接的帖子是正确的。您的输入将是单个协议缓冲区,通常应将其命名为“ FooRequest”。对于响应对象也是如此,应将其称为“ FooResponse”。将请求和响应对象从它们的内容中分离出来,将为您提供随时间向后兼容的方式更改API的空间。

事实上,我们不支持多种请求类型,这并不是一个障碍,因为原型可以任意嵌套。考虑这样的API。

 var uploadInput = '<form method="post" action="#"><div><input name="upload" type="file" /></div></form>';

        if (!kendoGrid) {
            $("#kgridDocuments").kendoGrid({
                scrollable: false,toolbar: ["search","create","save","cancel"],dataBound: function (e) {
                    $("input[type='file']").kendoUpload();
                },columns: [
                    {
                        template: "#= uploadInput #",title: "File Upload"
                    },{
                        field: "FileType",title: "File Type"
                    }
                ],noRecords: {
                    template: "No Result Found."
                },});
        }

当然,从服务器的角度来看,行为异常的客户端现在可以在流的中间发送文件名。或者相反,在不先发送文件名的情况下开始发送数据块。

您可以确定客户端必须发送文件名作为第一条消息。或者,只要在流结束之前发送文件名就可以了。也许发送文件名是完全可选的,不发送文件名将导致文件名使用默认值。

您对这些问题的决定 将成为您的API的一部分,但protobuf作为IDL将自动执行。您需要在服务器代码中显式处理这些极端情况。不过请记住,由于这些是API注意事项,因此应写在protobuf文件中的某个位置。尽力确保每个消息,RPC和字段都具有清晰简洁的文档字符串。

本文链接:https://www.f2er.com/3142068.html

大家都在问