Configurare HTTP e JSON per la transcodifica JSON gRPC

Nota

Questa non è la versione più recente di questo articolo. Per la versione corrente, vedere la versione .NET 9 di questo articolo.

Avviso

Questa versione di ASP.NET Core non è più supportata. Per altre informazioni, vedere Criteri di supporto di .NET e .NET Core. Per la versione corrente, vedere la versione .NET 8 di questo articolo.

Importante

Queste informazioni si riferiscono a un prodotto non definitive che può essere modificato in modo sostanziale prima che venga rilasciato commercialmente. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.

Per la versione corrente, vedere la versione .NET 9 di questo articolo.

Di James Newton-King

La transcodifica JSON gRPC crea API Web JSON RESTful dai metodi gRPC. Usa annotazioni e opzioni per personalizzare il mapping di un'API RESTful ai metodi gRPC.

Regole HTTP

I metodi gRPC devono essere annotati con una regola HTTP prima di supportare la transcodifica. La regola HTTP include informazioni sulla chiamata al metodo gRPC come API RESTful, ad esempio il metodo HTTP e la route.

import "google/api/annotations.proto";

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {
    option (google.api.http) = {
      get: "/v1/greeter/{name}"
    };
  }
}

Una regola HTTP è:

Nota

I collegamenti della documentazione all'origine del riferimento .NET in genere caricano il ramo predefinito del repository, che rappresenta lo sviluppo corrente per la versione successiva di .NET. Per selezionare un tag per una versione specifica, usare l'elenco a discesa Switch branches or tags. Per altre informazioni, vedere How to select a version tag of ASP.NET Core source code (dotnet/AspNetCore.Docs #26205) (Come selezionare un tag di versione del codice sorgente di ASP.NET - dotnet/AspNetCore.Docs #26205).

HTTP method (Metodo HTTP)

Il metodo HTTP viene specificato impostando la route sul nome del campo del metodo HTTP corrispondente:

  • get
  • put
  • post
  • delete
  • patch

Il custom campo consente altri metodi HTTP.

Nell'esempio seguente viene eseguito il mapping del CreateAddress metodo a POST con la route specificata:

service Address {
  rpc CreateAddress (CreateAddressRequest) returns (CreateAddressReply) {
    option (google.api.http) = {
      post: "/v1/address",
      body: "*"
    };
  }
}

Itinerario

Le route di transcodifica JSON gRPC supportano i parametri di route. Ad esempio, {name} in una route viene associata al campo nel name messaggio di richiesta.

Per associare un campo in un messaggio annidato, specificare il percorso del campo. Nell'esempio seguente viene {params.org} eseguito il binding al campo del org IssueParams messaggio:

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;
}

Le route di transcodifica e le route ASP.NET Core hanno una sintassi e un set di funzionalità simili. Tuttavia, alcune funzionalità di routing core ASP.NET non sono supportate dalla transcodifica. tra cui:

Testo della richiesta

La transerializzazione deserializza il corpo della richiesta JSON al messaggio di richiesta. Il body campo specifica il mapping del corpo della richiesta HTTP al messaggio di richiesta. Il valore è il nome del campo della richiesta il cui valore è mappato al corpo della richiesta HTTP o * per il mapping di tutti i campi della richiesta.

Nell'esempio seguente il corpo della richiesta HTTP viene deserializzato nel address campo :

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;
}

Parametri di query

Tutti i campi nel messaggio di richiesta non associati ai parametri di route o al corpo della richiesta possono essere impostati usando i parametri di query 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;
}

Nell'esempio precedente:

  • org i campi e repo sono associati dai parametri di route.
  • Altri campi, ad esempio text e i campi annidati da page, possono essere associati dalla stringa di query: ?text=value&page.index=0&page.size=10

Corpo della risposta

Per impostazione predefinita, la transcodifica serializza l'intero messaggio di risposta come JSON. Il response_body campo consente la serializzazione di un subset del messaggio di risposta.

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;
}

Nell'esempio precedente il address campo viene serializzato nel corpo della risposta come JSON.

Specifica

Per altre informazioni sulla personalizzazione della transcodifica gRPC, vedere la specifica HttpRule.

Personalizzare JSON

I messaggi vengono convertiti in e da JSON usando il mapping JSON nella specifica Protobuf. Il mapping JSON di Protobuf è un modo standardizzato per eseguire la conversione tra JSON e Protobuf e tutta la serializzazione segue queste regole.

Tuttavia, la transcodifica JSON gRPC offre alcune opzioni limitate per la personalizzazione di JSON con GrpcJsonSettings, come illustrato nella tabella seguente.

Opzione Valore predefinito Descrizione
IgnoreDefaultValues false Se impostato su true, i campi con valori predefiniti vengono ignorati durante la serializzazione.
WriteEnumsAsIntegers false Se impostato su true, i valori enumerazione vengono scritti come numeri interi anziché come stringhe.
WriteInt64sAsStrings false Se è impostato su truee UInt64 Int64 i valori vengono scritti come stringhe anziché come numeri.
WriteIndented false Se è impostato su true, JSON viene scritto usando una stampa piuttosto semplice. Questa opzione non influisce sui metodi di streaming, che scrivono messaggi JSON delimitati da righe e non possono usare la stampa.
builder.Services.AddGrpc().AddJsonTranscoding(o =>
{
    o.JsonSettings.WriteIndented = true;
});

.proto Nel file l'opzione json_name campo personalizza il nome di un campo quando viene serializzato come JSON, come nell'esempio seguente:

message TestMessage {
  string my_field = 1 [json_name="customFieldName"];
}

La transcodifica non supporta la personalizzazione JSON avanzata. Le app che richiedono un controllo preciso della struttura JSON devono prendere in considerazione l'uso di ASP.NET'API Web core.

Risorse aggiuntive