Я пытаюсь реализовать службу на C ++, которая должна получать доступ к объектам, хранящимся в хранилище данных Google Cloud.Служба будет работать в док-контейнере в Google Cloud.Я решил использовать gRPC вместо REST API.У меня есть рабочий пример gRPC в Python.Однако клиент C ++ gRPC аварийно завершает работу, когда вызывает метод заглушки.Поскольку это моя первая попытка доступа к Google Cloud с помощью gRPC, я не могу ручаться за правильность кода.Мой код зависит от сгенерированного протобуфа C ++, выводимого из googleapis , а также gRPC.
Сбой в библиотеке gRPC.После вызова метода он ждет и, вероятно, превышает крайний срок, а затем завершается неудачей.Подробный вывод или трассировка мало что дает.Похоже, что gRPC разыменовывает нулевой указатель в call_op_set.h: 71 (моя основная ветвь в настоящее время находится на 21c4e7d9f2).Я не построил gRPC с дезинфицирующими средствами;может быть, они могут поймать ошибку на ранней стадии.Похоже, что-то не так с метаданными.Мой код может быть неправильным, и это может быть причиной проблемы.Я не смог найти хороший пример этого в Интернете.Я пытаюсь прочитать код на Java и Python и применить его на C ++.
Мой главный вопрос о файле JSON.Я создал сервисную учетную запись в Google Cloud и ключ.Создание ключа заканчивается файлом JSON.Я пытаюсь получить его содержимое и перейти к ServiceAccountJWTAccessCredentials
в своем коде C ++.
Я был бы очень рад, если бы кто-то мог помочь мне найти ошибку.
#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();
}