我正在尝试使用C ++实现一项服务,该服务需要访问存储在Google Cloud Datastore中的实体。该服务将在Google Cloud上的docker容器中运行。我决定使用gRPC代替REST API。我在python中有一个工作的gRPC示例。但是,C ++ gRPC客户端在存根上调用方法时会崩溃。由于这是我第一次尝试使用gRPC访问Google Cloud,因此我无法保证代码的正确性。我的代码取决于从googleapis生成的protobuf C ++输出以及gRPC。
崩溃在gRPC库中。调用该方法后,它等待,并且可能超过了期限,然后失败。详细的输出或跟踪没有太多帮助。似乎gRPC正在取消引用call_op_set.h:71中的空指针(我的主分支当前位于21c4e7d9f2上)。我还没有使用消毒剂构建gRPC。也许他们可以尽早发现错误。看起来元数据有问题。我的代码可能是错误的,并且可能导致问题的根源。我在互联网上找不到很好的例子。我正在尝试阅读一些Java和Python代码,并将其应用于C ++。
我的主要问题是关于JSON文件。我已经在Google Cloud上创建了一个服务帐户和一个密钥。密钥创建以JSON文件结束。我正在尝试获取其内容,并传递给我的C ++代码中的ServiceAccountJWTAccessCredentials
。
如果有人可以帮助我发现错误,我将非常高兴。
#include <fstream>
#include <iostream>
#include <sstream>
#include <grpc++/grpc++.h>
#include "google/datastore/v1/datastore.grpc.pb.h"
#include "google/datastore/v1/query.pb.h"
static std::string get_file_contents(const char *filename) {
if (std::ifstream in(filename, std::ios::in | std::ios::binary); in) {
std::ostringstream contents;
contents << in.rdbuf();
in.close();
return (contents.str());
}
throw std::system_error(errno, std::generic_category());
}
int main() {
using namespace std::string_literals;
const std::string project_id = "my project id"s;
const char *file = "json-file-generated-by-service-account.json";
const std::string content = get_file_contents(file);
auto creds = grpc::CompositeChannelCredentials(
grpc::SslCredentials(grpc::SslCredentialsOptions()),
grpc::ServiceAccountJWTAccessCredentials(content));
auto channel = grpc::CreateChannel("datastore.googleapis.com:443"s, creds);
auto stub = google::datastore::v1::Datastore::NewStub(channel);
google::datastore::v1::RunQueryRequest qry;
auto mutq = qry.mutable_query();
auto k = mutq->mutable_kind();
auto added = k->Add();
added->set_name("my_kind"s);
qry.set_project_id(project_id);
grpc::ClientContext cli_ctx;
cli_ctx.set_initial_metadata_corked(true);
google::datastore::v1::RunQueryResponse resp;
auto status = stub->RunQuery(&cli_ctx, qry, &resp);
std::cout << "Error: code: " << status.error_code()
<< "\nMessage: " << status.error_message()
<< "\nDetails: " << status.error_details();
}