Настройка транскодирования HTTP и JSON для gRPC JSON
Примечание.
Это не последняя версия этой статьи. В текущем выпуске см . версию .NET 9 этой статьи.
Предупреждение
Эта версия ASP.NET Core больше не поддерживается. Дополнительные сведения см. в политике поддержки .NET и .NET Core. В текущем выпуске см . версию .NET 9 этой статьи.
Внимание
Эта информация относится к предварительному выпуску продукта, который может быть существенно изменен до его коммерческого выпуска. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
В текущем выпуске см . версию .NET 9 этой статьи.
Автор: Джеймс Ньютон-Кинг (James Newton-King)
Транскодирование JSON gRPC создает веб-API JSON RESTful из методов gRPC. В нем используются заметки и параметры настройки сопоставления API RESTful с методами gRPC.
Правила HTTP
Методы gRPC должны быть аннотированы с помощью правила HTTP, прежде чем они поддерживают перекодирование. Правило HTTP содержит сведения о вызове метода gRPC в качестве API RESTful, например метода HTTP и маршрута.
import "google/api/annotations.proto";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply) {
option (google.api.http) = {
get: "/v1/greeter/{name}"
};
}
}
Правило HTTP:
- Заметка о методах gRPC.
- Определяется именем
google.api.http
. - Импортирован из
google/api/annotations.proto
файла.google/api/annotations.proto
Файлыgoogle/api/http.proto
должны находиться в проекте.
Примечание.
По ссылкам в документации на справочные материалы по .NET обычно загружается ветвь репозитория по умолчанию, которая представляет текущую разработку для следующего выпуска .NET. Чтобы выбрать тег для определенного выпуска, используйте раскрывающийся список Switch branches or tags (Переключение ветвей или тегов). Дополнительные сведения см. в статье Выбор тега версии исходного кода ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Метод HTTP
Метод HTTP определяется путем задания маршрута к имени соответствующего поля метода HTTP:
get
put
post
delete
patch
Поле custom
позволяет использовать другие методы HTTP.
В следующем примере CreateAddress
метод сопоставляется с POST
указанным маршрутом:
service Address {
rpc CreateAddress (CreateAddressRequest) returns (CreateAddressReply) {
option (google.api.http) = {
post: "/v1/address",
body: "*"
};
}
}
Маршрут
Перекодирование маршрутов JSON gRPC поддерживает параметры маршрута. Например, {name}
в маршруте выполняется привязка к name
полю в сообщении запроса.
Чтобы привязать поле к вложенном сообщении, укажите путь к полю. В следующем примере {params.org}
привязывается к org
полю 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;
}
Маршруты транскодирования и ASP.NET Core имеют аналогичный синтаксис и набор функций. Однако некоторые функции маршрутизации ядра ASP.NET не поддерживаются транскодированием. Например:
Текст запроса
Перекодирование десериализирует текст запроса JSON в сообщение запроса. Поле body
указывает, как текст HTTP-запроса сопоставляется с сообщением запроса. Значение — это имя поля запроса, значение которого сопоставляется с текстом HTTP-запроса или *
для сопоставления всех полей запроса.
В следующем примере текст HTTP-запроса десериализируется в 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;
}
Параметры запроса
Все поля в сообщении запроса, которые не привязаны параметрами маршрута или текст запроса, можно задать с помощью параметров 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;
}
В предыдущем примере:
org
иrepo
поля привязаны из параметров маршрута.- Другие поля, такие как
text
и вложенные поляpage
, могут быть привязаны из строки запроса:?text=value&page.index=0&page.size=10
Текст ответа
По умолчанию транскодирование сериализует весь ответный сообщение как JSON. Поле response_body
позволяет сериализовать подмножество сообщения ответа.
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;
}
В предыдущем примере address
поле сериализуется в текст ответа в формате JSON.
Спецификация
Дополнительные сведения о настройке транскодирования gRPC см. в спецификации HttpRule.
Настройка JSON
Сообщения преобразуются в JSON и из них с помощью сопоставления JSON в спецификации Protobuf. Сопоставление JSON Protobuf является стандартизированным способом преобразования между JSON и Protobuf, и все сериализация следует этим правилам.
Однако транскодирование JSON gRPC предлагает некоторые ограниченные варианты настройки JSON с GrpcJsonSettingsпомощью, как показано в следующей таблице.
Вариант | Значение по умолчанию | Description |
---|---|---|
IgnoreDefaultValues | false |
Если задано значение true , поля со значениями по умолчанию игнорируются во время сериализации. |
WriteEnumsAsIntegers | false |
Если задано значение true , значения перечисления записываются как целые числа вместо строк. |
WriteInt64sAsStrings | false |
Если задано значение true , Int64 а UInt64 значения записываются как строки вместо чисел. |
WriteIndented | false |
Если задано значение true , JSON записывается с помощью довольно печати. Этот параметр не влияет на методы потоковой передачи, которые записывают сообщения JSON с разделителями строк и не могут использовать довольно печать. |
builder.Services.AddGrpc().AddJsonTranscoding(o =>
{
o.JsonSettings.WriteIndented = true;
});
.proto
В файле json_name
параметр поля настраивает имя поля при сериализации в формате JSON, как показано в следующем примере:
message TestMessage {
string my_field = 1 [json_name="customFieldName"];
}
Транскодирование не поддерживает расширенную настройку JSON. Приложения, требующие точного элемента управления структурой JSON, должны рассмотреть возможность использования ASP.NET Core Web API.
Дополнительные ресурсы
ASP.NET Core