Google Cloud Storage to usługa magazynowania obiektów firmy Google. Dane mieszczą się w zasobnikach, a każdy zasobnik przechowuje obiekty (pliki), które przesyłasz, wyświetlasz, odczytujesz i usuwasz. Większość kodu Delphi dociera do niego przez API REST w formacie JSON, ale usługa magazynowania udostępnia również API gRPC, które rozmawia w Protocol Buffers przez HTTP/2. sgcWebSockets Enterprise dostarcza typowanego klienta gRPC Cloud Storage zbudowanego na TsgcGRPCClient, więc możesz zarządzać zasobnikami i obiektami z Delphi i C++Builder bez żadnego zewnętrznego środowiska uruchomieniowego ani generowanych stubów.
Jak to działa
API gRPC Storage mieści się pod adresem storage.googleapis.com:443 i obsługuje usługę google.storage.v2.Storage. sgcWebSockets dostarcza już kompletny stos HTTP/2, więc typowany klient działa na transporcie TsgcHTTP2Client z włączonym TLS. TsgcGRPCClient wykonuje opakowywanie gRPC, nagłówki i obsługę limitów czasu, otwiera strumień HTTP/2 oraz parsuje odpowiedź i trailery z powrotem do TsgcGRPCResponse.
Warstwa typowana znajduje się w module sgcGRPC_Google_Storage. Daje Ci klasy żądań i odpowiedzi takie jak TsgcGRPCStorageListBucketsRequest, TsgcGRPCStorageListObjectsResponse i TsgcGRPCStorageBucket, które serializują się do i z Protocol Buffers. Ustawiasz typowane właściwości, wywołujesz ToBytes, aby uzyskać ładunek żądania, wysyłasz go za pomocą Call i wczytujesz odpowiedź za pomocą LoadFromBytes. Bez kompilatora protobuf, bez ręcznie pisanych znaczników pól.
Uwierzytelnianie korzysta z konta usługi Google. Klient podpisuje token JSON Web Token z klucza konta usługi i przedstawia go jako token Bearer w metadanych authorization gRPC, co jest standardowym sposobem, w jaki Google Cloud autoryzuje wywołania serwer-serwer.
Konfigurowanie transportu
Kanał gRPC to po prostu połączenie HTTP/2. Wskaż TsgcHTTP2Client na punkt końcowy magazynowania z włączonym TLS, a następnie dołącz go do TsgcGRPCClient i wybierz binarny typ zawartości Protocol Buffers.
uses
sgcHTTP2_Client, sgcGRPC_Client, sgcGRPC_Types, sgcGRPC_Google_Storage;
var
HTTP2: TsgcHTTP2Client;
GRPC: TsgcGRPCClient;
begin
HTTP2 := TsgcHTTP2Client.Create(nil);
HTTP2.Host := 'storage.googleapis.com';
HTTP2.Port := 443;
HTTP2.TLS := True;
GRPC := TsgcGRPCClient.Create(nil);
GRPC.Client := HTTP2;
GRPC.ChannelOptions.ContentType := grpcProto;
GRPC.ChannelOptions.Compression := grpcNoCompression;
HTTP2.Active := True;
end;
Uwierzytelnianie za pomocą konta usługi
Wczytaj klucz JSON konta usługi, skonfiguruj JWT podpisany dla punktu końcowego magazynowania i umieść otrzymany token w DefaultMetadata, aby towarzyszył każdemu wywołaniu. Samodzielnie podpisany JWT konta usługi jest powiązany z odbiorcą, więc API_Endpoint musi wskazywać na storage.googleapis.com, aby token został zaakceptowany.
var
Cloud: TsgcHTTPGoogleCloud_PubSub_Client;
begin
Cloud := TsgcHTTPGoogleCloud_PubSub_Client.Create(nil);
Cloud.LoadSettingsFromFile('service-account.json');
Cloud.GoogleCloudOptions.Authentication := gcaJWT;
Cloud.GoogleCloudOptions.JWT.API_Endpoint := 'https://storage.googleapis.com/';
// OnAuthToken fires when the token is ready; copy it into the gRPC metadata
GRPC.DefaultMetadata.Clear;
GRPC.DefaultMetadata.Add('authorization', 'Bearer ' + Token);
end;
Wyświetlanie zasobników
Aby wyliczyć zasobniki w projekcie, wypełnij TsgcGRPCStorageListBucketsRequest z projektem jako Parent, zserializuj go i wykonaj unarne Call do metody ListBuckets. Bajty odpowiedzi wczytują się bezpośrednio do TsgcGRPCStorageListBucketsResponse, która udostępnia każdy zasobnik z jego nazwą i lokalizacją.
var
oRequest: TsgcGRPCStorageListBucketsRequest;
oResponse: TsgcGRPCResponse;
oBuckets: TsgcGRPCStorageListBucketsResponse;
i: Integer;
begin
oRequest := TsgcGRPCStorageListBucketsRequest.Create;
try
oRequest.Parent := 'projects/' + ProjectId;
oRequest.PageSize := 100;
oResponse := GRPC.Call('google.storage.v2.Storage', 'ListBuckets',
oRequest.ToBytes);
finally
oRequest.Free;
end;
if oResponse.StatusCode = grpcOK then
begin
oBuckets := TsgcGRPCStorageListBucketsResponse.Create;
try
oBuckets.LoadFromBytes(oResponse.Data);
for i := 0 to oBuckets.BucketCount - 1 do
Memo1.Lines.Add(oBuckets.Bucket(i).Name + ' (location: ' +
oBuckets.Bucket(i).Location + ')');
finally
oBuckets.Free;
end;
end;
end;
Tworzenie zasobnika
Tworzenie zasobnika podąża za tym samym wzorcem z TsgcGRPCStorageCreateBucketRequest. Ustaw projekt nadrzędny, identyfikator nowego zasobnika oraz projekt będący właścicielem zasobu zasobnika, a następnie wywołaj CreateBucket. Odpowiedź zawiera utworzony TsgcGRPCStorageBucket.
var
oRequest: TsgcGRPCStorageCreateBucketRequest;
oResponse: TsgcGRPCResponse;
begin
oRequest := TsgcGRPCStorageCreateBucketRequest.Create;
try
oRequest.Parent := 'projects/' + ProjectId;
oRequest.BucketId := 'my-new-bucket';
oRequest.Bucket.Project := 'projects/' + ProjectId;
oResponse := GRPC.Call('google.storage.v2.Storage', 'CreateBucket',
oRequest.ToBytes);
finally
oRequest.Free;
end;
end;
Wyświetlanie obiektów w zasobniku
Wyświetlanie obiektów w zasobniku korzysta z TsgcGRPCStorageListObjectsRequest. Element nadrzędny to nazwa zasobu zasobnika w postaci projects/_/buckets/<bucket>. Odpowiedź daje Ci nazwę, rozmiar i typ zawartości każdego obiektu, a opcjonalnie możesz ustawić Prefix i Delimiter, aby przejść hierarchię podobną do folderów.
var
oRequest: TsgcGRPCStorageListObjectsRequest;
oResponse: TsgcGRPCResponse;
oObjects: TsgcGRPCStorageListObjectsResponse;
i: Integer;
begin
oRequest := TsgcGRPCStorageListObjectsRequest.Create;
try
oRequest.Parent := 'projects/_/buckets/' + BucketName;
oRequest.PageSize := 100;
oResponse := GRPC.Call('google.storage.v2.Storage', 'ListObjects',
oRequest.ToBytes);
finally
oRequest.Free;
end;
if oResponse.StatusCode = grpcOK then
begin
oObjects := TsgcGRPCStorageListObjectsResponse.Create;
try
oObjects.LoadFromBytes(oResponse.Data);
for i := 0 to oObjects.ObjectCount - 1 do
Memo1.Lines.Add(oObjects.Object_(i).Name + ' (size: ' +
IntToStr(oObjects.Object_(i).Size) + ', type: ' +
oObjects.Object_(i).ContentType + ')');
finally
oObjects.Free;
end;
end;
end;
Odczyt i zapis danych obiektu
Poza metadanymi zasobników i obiektów, moduł obejmuje również ładunki obiektów. TsgcGRPCStorageReadObjectRequest odczytuje bajty z obiektu, z opcjonalnymi ReadOffset i ReadLimit dla pobierania zakresowego, a pasująca odpowiedź udostępnia surowe bajty Data. TsgcGRPCStorageWriteObjectRequest przesyła zawartość obiektu w fragmentach: ustaw zasób WriteObjectSpec dla pierwszego fragmentu, wypychaj Data przy rosnących wartościach WriteOffset i oznacz FinishWrite na ostatnim fragmencie. Ponieważ każdy komunikat serializuje się przez ToBytes i LoadFromBytes, te same typowane klasy działają niezależnie od tego, czy przesyłasz mały plik w jednym wywołaniu, czy strumieniujesz duży obiekt w częściach.
Stronicowanie i obsługa błędów
Odpowiedzi list zwracają NextPageToken, gdy dostępne są dodatkowe wyniki. Skopiuj go do PageToken następnego żądania i wywołaj ponownie, aby przejść przez duże zasobniki lub długie listy obiektów. Po stronie błędów każda TsgcGRPCResponse zawiera typowany StatusCode, więc wynik inny niż grpcOK dokładnie mówi Ci, co poszło nie tak, od grpcUNAUTHENTICATED przy nieprawidłowym lub brakującym tokenie po grpcNOT_FOUND przy brakującym zasobniku. W pracy asynchronicznej OnGRPCResponse, OnGRPCError i OnGRPCException dostarczają te same informacje przez zdarzenia.
Dostępność
Typowany klient gRPC Google Cloud Storage jest częścią edycji Enterprise sgcWebSockets. Kompletny, gotowy do uruchomienia przykład znajduje się w Demos\21.GRPC\15.Cloud_Storage, obejmując uwierzytelnianie, wyświetlanie i tworzenie zasobników oraz wyświetlanie obiektów. Pełna dokumentacja jest na stronie produktu gRPC Client.
Pytania lub uwagi? Skontaktuj się z nami. Otrzymasz odpowiedź od osób, które napisały ten kod.
