Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Uwaga
Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z aktualną wersją, zobacz artykuł w wersji .NET 10.
Ostrzeżenie
Ta wersja ASP.NET Core nie jest już obsługiwana. Aby uzyskać więcej informacji, zobacz zasady pomocy technicznej platformy .NET i platformy .NET Core. Aby zapoznać się z aktualną wersją, zobacz artykuł w wersji .NET 10.
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 adnotacją z regułą HTTP, zanim będą obsługiwać 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 dotycząca metod gRPC.
- Zidentyfikowane o nazwie
google.api.http. - Zaimportowane z pliku
google/api/annotations.proto. Plikigoogle/api/http.protoigoogle/api/annotations.protomuszą znajdować się w projekcie.
Uwaga
Linki dokumentacji do źródła referencyjnego platformy .NET zwykle ładują domyślną gałąź repozytorium, która odzwierciedla bieżący rozwój następnej wersji platformy .NET. Aby wybrać tag dla określonego wydania, użyj listy rozwijanej Przełącz gałęzie lub tagi.
metoda HTTP
Metoda HTTP jest określana przez ustawienie trasy na zgodną nazwę pola metody HTTP:
getputpostdeletepatch
Pole custom umożliwia korzystanie z innych metod HTTP.
W poniższym przykładzie metoda CreateAddress jest mapowana na POST przy użyciu określonej trasy:
service Address {
rpc CreateAddress (CreateAddressRequest) returns (CreateAddressReply) {
option (google.api.http) = {
post: "/v1/address",
body: "*"
};
}
}
Trasa
Trasy transkodowania JSON gRPC obsługują parametry trasy. Na przykład {name} w trasie routingu jest powiązane z polem name w komunikacie żądania.
Aby powiązać pole w zagnieżdżonej wiadomości, określ ścieżkę do pola. W poniższym przykładzie {params.org} wiąże się z polem org w komunikacie IssueParams:
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 w formacie JSON do komunikatu żądania. Pole body określa sposób mapowania treści żądania HTTP na komunikat żądania. Wartość jest albo nazwą pola żądania, którego wartość jest mapowana na treść żądania HTTP, albo * do mapowania wszystkich pól żądania.
W poniższym przykładzie treść żądania HTTP jest deserializowana do pola address:
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ścią żą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:
- Pola
orgireposą powiązane z parametrami trasy. - Inne pola, takie jak
text, i pola zagnieżdżone z elementupage, mogą być powiązane z parametrami 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 serializację 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 pole address jest serializowane do treści odpowiedzi jako JSON.
Specyfikacja
Aby uzyskać więcej informacji na temat dostosowywania transkodowania gRPC, zobacz specyfikację HttpRule.
Dostosuj JSON
Komunikaty są konwertowane na i z formatu JSON przy użyciu mapowania JSON w specyfikacji Protobuf. Mapowanie JSON w Protobuf to ustandaryzowany sposób konwersji między formatami JSON i Protobuf, a wszystkie serializacje są zgodne z tymi regułami.
Jednak transkodowanie gRPC JSON oferuje pewne ograniczone opcje dostosowywania kodu JSON za pomocą GrpcJsonSettings, jak pokazano w poniższej tabeli.
| Opcja | Wartość domyślna | Opis |
|---|---|---|
| IgnoreDefaultValues | false |
W przypadku ustawienia wartości truepola z wartościami domyślnymi są ignorowane podczas serializacji. |
| WriteEnumsAsIntegers | false |
Jeśli ustawiono true, wartości wyliczenia są zapisywane jako liczby całkowite zamiast ciągów. |
| WriteInt64sAsStrings | false |
Jeśli ustawiono wartość true, wartości Int64 i UInt64 są zapisywane jako ciągi zamiast liczb. |
| WriteIndented | false |
Jeśli ustawiono wartość true, kod JSON jest zapisywany z formatowaniem pretty print. Ta opcja nie ma wpływu na metody przesyłania strumieniowego, które zapisują komunikaty JSON rozdzielane wierszami i nie mogą używać formatowania z wcięciami. |
builder.Services.AddGrpc().AddJsonTranscoding(o =>
{
o.JsonSettings.WriteIndented = true;
});
W pliku .proto opcja pola json_name dostosowuje nazwę pola używaną podczas serializacji do formatu 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 Web API.