Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Poznámka:
Toto není nejnovější verze tohoto článku. Aktuální verzi najdete ve verzi .NET 10 tohoto článku.
Upozorňující
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v zásadách podpory .NET a .NET Core. Aktuální verzi najdete v tomto článku ve verzi .NET 9.
Autor: James Newton-King
Transkódování json gRPC vytváří webová rozhraní RESTful JSON API z metod gRPC. Používá poznámky a možnosti pro přizpůsobení způsobu mapování rozhraní RESTful API na metody gRPC.
Pravidla HTTP
Metody gRPC musí být před podporou překódování opatřeny poznámkami s pravidlem HTTP. Pravidlo HTTP obsahuje informace o volání metody gRPC jako rozhraní RESTful API, jako je metoda HTTP a trasa.
import "google/api/annotations.proto";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {
option (google.api.http) = {
get: "/v1/greeter/{name}"
};
}
}
Pravidlo HTTP je:
- Poznámka k metodám gRPC.
- Identifikovaný názvem
google.api.http. - Importováno ze
google/api/annotations.protosouboru. Souborygoogle/api/http.protoagoogle/api/annotations.protosoubory musí být v projektu.
Poznámka:
Odkazy na dokumentaci k referenčnímu zdroji .NET obvykle načítají výchozí větev úložiště, která představuje aktuální vývoj pro příští verzi .NET. Pokud chcete vybrat značku pro konkrétní verzi, použijte rozevírací seznam pro přepnutí větví nebo značek. Další informace najdete v tématu Jak vybrat značku verze zdrojového kódu ASP.NET Core (dotnet/AspNetCore.Docs #26205).
metoda HTTP
Metoda HTTP je určena nastavením trasy na odpovídající název pole metody HTTP:
getputpostdeletepatch
Pole custom umožňuje jiné metody HTTP.
V následujícím příkladu CreateAddress se metoda mapuje na POST zadanou trasu:
service Address {
rpc CreateAddress (CreateAddressRequest) returns (CreateAddressReply) {
option (google.api.http) = {
post: "/v1/address",
body: "*"
};
}
}
Postup
Trasy transkódování json gRPC podporují parametry trasy. Například {name} ve směrování je svázané s name polem ve zprávě požadavku.
Pokud chcete svázat pole s vnořenou zprávou, zadejte cestu k poli. V následujícím příkladu {params.org}org vytvoří vazbu na pole ve IssueParams zprávě:
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;
}
Překódování tras a tras ASP.NET Core mají podobnou syntaxi a sadu funkcí. Některé funkce směrování jádra ASP.NET ale transkódování nepodporují. Tady jsou některé z nich:
Text požadavku
Překódování deserializuje základní kód JSON požadavku na zprávu požadavku. Pole body určuje, jak se tělo požadavku HTTP mapuje na zprávu požadavku. Hodnota je buď název pole požadavku, jehož hodnota je namapována na tělo požadavku HTTP, nebo * pro mapování všech polí požadavku.
V následujícím příkladu je tělo požadavku HTTP deserializováno address do pole:
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 dotazů
Všechna pole ve zprávě požadavku, která nejsou vázána parametry trasy nebo text požadavku lze nastavit pomocí parametrů dotazu 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;
}
V předchozím příkladu:
-
orgarepopole jsou svázaná s parametry trasy. - Další pole, jako
textjsou a vnořená pole zpage, mohou být vázána z řetězce dotazu:?text=value&page.index=0&page.size=10
Text odpovědi
Ve výchozím nastavení překódování serializuje celou zprávu odpovědi jako JSON. Pole response_body umožňuje serializaci podmnožinu zprávy odpovědi.
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;
}
V předchozím příkladu address je pole serializováno do textu odpovědi jako JSON.
Specifikace
Další informace o přizpůsobení transkódování gRPC naleznete ve specifikaci HttpRule.
Přizpůsobení FORMÁTU JSON
Zprávy se převedou do formátu JSON a z formátu JSON pomocí mapování JSON ve specifikaci Protobuf. Mapování JSON protobuf je standardizovaný způsob převodu mezi JSON a Protobufem a všechna serializace se řídí těmito pravidly.
Transkódování gRPC JSON však nabízí několik omezených možností pro přizpůsobení FORMÁTU JSON pomocí GrpcJsonSettings, jak je znázorněno v následující tabulce.
| Možnost | Výchozí hodnota | Popis |
|---|---|---|
| IgnoreDefaultValues | false |
Pokud je nastavena hodnota true, pole s výchozími hodnotami se během serializace ignorují. |
| WriteEnumsAsIntegers | false |
Pokud je hodnota nastavena na true, hodnoty výčtu se zapisují jako celá čísla místo řetězců. |
| WriteInt64sAsStrings | false |
Pokud je nastavena hodnota truea Int64UInt64 hodnoty se zapisují jako řetězce místo čísel. |
| WriteIndented | false |
Pokud je nastavená hodnota true, json se zapíše pomocí hezkého tisku. Tato možnost nemá vliv na metody streamování, které zapisují zprávy JSON s oddělovači řádků a nemůžou používat pěkný tisk. |
builder.Services.AddGrpc().AddJsonTranscoding(o =>
{
o.JsonSettings.WriteIndented = true;
});
Možnost pole v .proto souboru json_name přizpůsobí název pole při serializaci jako JSON, jak je znázorněno v následujícím příkladu:
message TestMessage {
string my_field = 1 [json_name="customFieldName"];
}
Překódování nepodporuje pokročilé přizpůsobení JSON. Aplikace vyžadující přesné řízení struktury JSON by měly zvážit použití ASP.NET základního webového rozhraní API.