Konfigurowanie transkodowania http i JSON dla transkodowania gRPC JSON
Uwaga
Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.
Ostrzeżenie
Ta wersja ASP.NET Core nie jest już obsługiwana. Aby uzyskać więcej informacji, zobacz .NET i .NET Core Support Policy (Zasady obsługi platformy .NET Core). Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.
Ważne
Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Aby zapoznać się z bieżącą wersją, zapoznaj się z wersją tego artykułu platformy .NET 8.
Autor: James Newton-King
Transkodowanie gRPC JSON tworzy internetowe interfejsy API RESTful JSON z metod gRPC. Używa adnotacji i opcji dostosowywania sposobu mapowania interfejsu API RESTful na metody gRPC.
Reguły HTTP
Metody gRPC muszą być oznaczone adnotacjami z regułą HTTP, zanim obsługują transkodowanie. Reguła HTTP zawiera informacje dotyczące wywoływania metody gRPC jako interfejsu API RESTful, takich jak metoda HTTP i trasa.
import "google/api/annotations.proto";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {
option (google.api.http) = {
get: "/v1/greeter/{name}"
};
}
}
Reguła HTTP to:
- Adnotacja dla metod gRPC.
- Zidentyfikowane przez nazwę
google.api.http
. - Zaimportowane z
google/api/annotations.proto
pliku. Plikigoogle/api/http.proto
igoogle/api/annotations.proto
muszą znajdować się w projekcie.
Uwaga
Linki dokumentacji do źródła referencyjnego platformy .NET zwykle ładują domyślną gałąź repozytorium, która odzwierciedla bieżące programowanie dla następnej wersji platformy .NET. Aby wybrać tag dla określonej wersji, użyj listy rozwijanej Przełącz gałęzie lub tagi. Aby uzyskać więcej informacji, zobacz Jak wybrać tag wersji kodu źródłowego platformy ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Metoda HTTP
Metoda HTTP jest określana przez ustawienie trasy na zgodną nazwę pola metody HTTP:
get
put
post
delete
patch
Pole custom
umożliwia korzystanie z innych metod HTTP.
W poniższym przykładzie CreateAddress
metoda jest mapowana na POST
określoną trasę:
service Address {
rpc CreateAddress (CreateAddressRequest) returns (CreateAddressReply) {
option (google.api.http) = {
post: "/v1/address",
body: "*"
};
}
}
Marszruta
Trasy transkodowania JSON gRPC obsługują parametry trasy. Na przykład {name}
w trasie wiąże się z name
polem w komunikacie żądania.
Aby powiązać pole z zagnieżdżonym komunikatem, określ ścieżkę do pola. W poniższym przykładzie {params.org}
powiązanie z polem org
w IssueParams
komunikacie:
service Repository {
rpc GetIssue (GetIssueRequest) returns (GetIssueReply) {
option (google.api.http) = {
get: "/{apiVersion}/{params.org}/{params.repo}/issue/{params.issueId}"
};
}
}
message GetIssueRequest {
int32 api_version = 1;
IssueParams params = 2;
}
message IssueParams {
string org = 1;
string repo = 2;
int32 issueId = 3;
}
Trasy transkodowania i trasy ASP.NET Core mają podobną składnię i zestaw funkcji. Jednak niektóre funkcje routingu ASP.NET Core nie są obsługiwane przez transkodowanie. Są to:
Treść żądania
Transkodowanie deserializuje treść żądania JSON do komunikatu żądania. Pole body
określa sposób mapowania treści żądania HTTP na komunikat żądania. Wartość jest nazwą pola żądania, którego wartość jest mapowana na treść żądania HTTP lub *
do mapowania wszystkich pól żądania.
W poniższym przykładzie treść żądania HTTP jest deserializowana do address
pola:
service Address {
rpc AddAddress (AddAddressRequest) returns (AddAddressReply) {
option (google.api.http) = {
post: "/{apiVersion}/address",
body: "address"
};
}
}
message AddAddressRequest {
int32 api_version = 1;
Address address = 2;
}
message Address {
string street = 1;
string city = 2;
string country = 3;
}
Parametry zapytań
Wszystkie pola w komunikacie żądania, które nie są powiązane z parametrami trasy lub treść żądania, można ustawić przy użyciu parametrów zapytania HTTP.
service Repository {
rpc GetIssues (GetIssuesRequest) returns (GetIssuesReply) {
option (google.api.http) = {
get: "/v1/{org}/{repo}/issue"
};
}
}
message GetIssuesRequest {
string org = 1;
string repo = 2;
string text = 3;
PageParams page = 4;
}
message PageParams {
int32 index = 1;
int32 size = 2;
}
W powyższym przykładzie:
org
pola irepo
są powiązane z parametrami trasy.- Inne pola, takie jak
text
i pola zagnieżdżone zpage
elementu , mogą być powiązane z ciągu zapytania:?text=value&page.index=0&page.size=10
Treść odpowiedzi
Domyślnie transkodowanie serializuje cały komunikat odpowiedzi w formacie JSON. Pole response_body
umożliwia serializacji podzestawu komunikatu odpowiedzi.
service Address {
rpc GetAddress (GetAddressRequest) returns (GetAddressReply) {
option (google.api.http) = {
get: "/v1/address/{id}",
response_body: "address"
};
}
}
message GetAddressReply {
int32 version = 1;
Address address = 2;
}
message Address {
string street = 1;
string city = 2;
string country = 3;
}
W poprzednim przykładzie address
pole jest serializowane do treści odpowiedzi jako JSON.
Specyfikacja
Aby uzyskać więcej informacji na temat dostosowywania transkodowania gRPC, zobacz specyfikację HttpRule.
Dostosowywanie formatu JSON
Komunikaty są konwertowane na i z formatu JSON przy użyciu mapowania JSON w specyfikacji Protobuf. Mapowanie kodu JSON protobuf to ustandaryzowany sposób konwersji między formatami JSON i Protobuf, a wszystkie serializacji są zgodne z tymi regułami.
Jednak transkodowanie gRPC JSON oferuje pewne ograniczone opcje dostosowywania kodu JSON za pomocą GrpcJsonSettingspolecenia , jak pokazano w poniższej tabeli.
Opcja | Wartość domyślna | opis |
---|---|---|
IgnoreDefaultValues | false |
W przypadku ustawienia wartości true pola z wartościami domyślnymi są ignorowane podczas serializacji. |
WriteEnumsAsIntegers | false |
Jeśli ustawiono true wartość , wartości wyliczenia są zapisywane jako liczby całkowite zamiast ciągów. |
WriteInt64sAsStrings | false |
Jeśli ustawiono true wartość , Int64 a UInt64 wartości są zapisywane jako ciągi zamiast liczb. |
WriteIndented | false |
Jeśli ustawiono wartość true , kod JSON jest zapisywany przy użyciu dość drukowania. Ta opcja nie ma wpływu na metody przesyłania strumieniowego, które zapisują komunikaty JSON rozdzielane wierszami i nie mogą używać dość drukowania. |
builder.Services.AddGrpc().AddJsonTranscoding(o =>
{
o.JsonSettings.WriteIndented = true;
});
.proto
W pliku json_name
opcja pola dostosowuje nazwę pola, gdy jest serializowany jako JSON, jak w poniższym przykładzie:
message TestMessage {
string my_field = 1 [json_name="customFieldName"];
}
Transkodowanie nie obsługuje zaawansowanego dostosowywania JSON. Aplikacje wymagające precyzyjnej kontroli struktury JSON powinny rozważyć użycie ASP.NET core internetowego interfejsu API.