Origine dati HTTP per un resolver

SI APPLICA A: Tutti i livelli di Gestione API

Il criterio del resolver http-data-source consente di configurare la richiesta HTTP e, facoltativamente, la risposta HTTP per risolvere i dati per un tipo di oggetto e un campo in uno schema GraphQL. Lo schema deve essere importato in Gestione API come API GraphQL.

Nota

Impostare gli elementi e gli elementi figlio del criterio nell'ordine specificato nell'istruzione del criterio. Altre informazioni su come impostare o modificare i criteri di API Management.

Istruzione del criterio

<http-data-source> 
    <http-request>
        <get-authorization-context>...get-authorization-context policy configuration...</get-authorization-context>
        <set-backend-service>...set-backend-service policy configuration...</set-backend-service>
        <set-method>...set-method policy configuration...</set-method> 
        <set-url>URL</set-url>
        <include-fragment>...include-fragment policy configuration...</include-fragment>
        <set-header>...set-header policy configuration...</set-header>
        <set-body>...set-body policy configuration...</set-body>
        <authentication-certificate>...authentication-certificate policy configuration...</authentication-certificate>  
    </http-request> 
    <backend>
        <forward-request>...forward-request policy configuration...</forward-request>
    <http-response>
        <set-body>...set-body policy configuration...</set-body>
        <xml-to-json>...xml-to-json policy configuration...</xml-to-json>
        <find-and-replace>...find-and-replace policy configuration...</find-and-replace>
        <publish-event>...publish-event policy configuration...</publish-event>
        <include-fragment>...include-fragment policy configuration...</include-fragment>
    </http-response>
</http-data-source> 

Elementi

Nome Descrizione Richiesto
http-request Specifica un URL e i criteri figlio per configurare la richiesta HTTP del resolver.
back-end Facoltativamente, inoltra la richiesta HTTP del resolver a un servizio back-end, se specificato. No
http-response Facoltativamente, specifica i criteri figlio per configurare la risposta HTTP del resolver. Se non viene specificato, la risposta viene restituita come stringa non elaborata. No

Elementi di http-request

Nota

Tranne dove indicato, ogni elemento figlio può essere specificato al massimo una volta. Specificare gli elementi nell'ordine elencato.

Elemento Descrizione Richiesto
get-authorization-context Ottiene un contesto di autorizzazione per la richiesta HTTP del resolver. No
set-backend-service Reindirizza la richiesta HTTP del resolver al back-end specificato. No
include-fragment Inserisce un frammento di criterio nella definizione del criterio. Se sono presenti più frammenti, aggiungere altri elementi include-fragment. No
set-method Imposta il metodo della richiesta HTTP del resolver.
set-url Imposta l'URL della richiesta HTTP del resolver.
set-header Imposta un'intestazione nella richiesta HTTP del resolver. Se sono presenti più intestazioni, aggiungere altri elementi header. No
set-body Imposta il corpo nella richiesta HTTP del resolver. No
authentication-certificate Esegue l'autenticazione usando un certificato client nella richiesta HTTP del resolver. No

Elemento di backend

Elemento Descrizione Richiesto
forward-request Inoltra la richiesta HTTP del resolver a un servizio back-end configurato. No

Elementi di http-response

Nota

Tranne dove indicato, ogni elemento figlio può essere specificato al massimo una volta. Specificare gli elementi nell'ordine elencato.

Nome Descrizione Richiesto
set-body Imposta il corpo nella risposta HTTP del resolver. No
xml-to-json Trasforma la risposta HTTP del resolver da XML a JSON. No
find-and-replace Trova una sottostringa nella risposta HTTP del resolver e la sostituisce con una sottostringa diversa. No
publish-event Pubblica un evento in una o più sottoscrizioni specificate nello schema dell'API GraphQL. No
include-fragment Inserisce un frammento di criterio nella definizione del criterio. Se sono presenti più frammenti, aggiungere altri elementi include-fragment. No

Utilizzo

Note sull'utilizzo

  • Per configurare e gestire un resolver con questo criterio, vedere Configurare un resolver GraphQL.
  • Questo criterio viene richiamato solo quando si risolve un singolo campo in un tipo di operazione GraphQL corrispondente nello schema.

Esempi

Resolver per una query GraphQL

L'esempio seguente risolve una query effettuando una chiamata HTTP GET a un'origine dati back-end.

Schema di esempio

type Query {
    users: [User]
}

type User {
    id: String!
    name: String!
}

Criterio di esempio

<http-data-source>
    <http-request>
        <set-method>GET</set-method>
        <set-url>https://data.contoso.com/get/users</set-url>
    </http-request>
</http-data-source>

Resolver per una query GraphQL che restituisce un elenco, usando un modello Liquid

Nell'esempio seguente viene usato un modello Liquid, supportato per l'uso nel criterio set-body, per restituire un elenco nella risposta HTTP a una query. Viene anche rinominato il campo username nella risposta restituita dall'API REST per name nella risposta GraphQL.

Schema di esempio

type Query {
    users: [User]
}

type User {
    id: String!
    name: String!
}

Criterio di esempio

<http-data-source>
    <http-request>
        <set-method>GET</set-method>
        <set-url>https://data.contoso.com/users</set-url>
    </http-request>
    <http-response>
        <set-body template="liquid">
            [
                {% JSONArrayFor elem in body %}
                    {
                        "name": "{{elem.username}}"
                    }
                {% endJSONArrayFor %}
            ]
        </set-body>
    </http-response>
</http-data-source>

Resolver per una mutazione GraphQL

Nell'esempio seguente viene risolta una mutazione che inserisce dati effettuando una richiesta POST a un'origine dati HTTP. L'espressione nel criterio set-body della richiesta HTTP modifica un argomento name passato come corpo nella query GraphQL. Il corpo inviato sarà simile al codice JSON seguente:

{
    "name": "the-provided-name"
}

Schema di esempio

type Query {
    users: [User]
}

type Mutation {
    makeUser(name: String!): User
}

type User {
    id: String!
    name: String!
}

Criterio di esempio

<http-data-source>
    <http-request>
        <set-method>POST</set-method>
        <set-url>https://data.contoso.com/user/create </set-url>
        <set-header name="Content-Type" exists-action="override">
            <value>application/json</value>
        </set-header>
        <set-body>@{
            var args = context.GraphQL.Arguments;  
            JObject jsonObject = new JObject();
            jsonObject.Add("name", args["name"])
            return jsonObject.ToString();
        }</set-body>
    </http-request>
</http-data-source>

Resolver per il tipo di unione GraphQL

L'esempio seguente risolve la query orderById effettuando una chiamata HTTP GET a un'origine dati back-end e restituisce un oggetto JSON che include l'ID cliente e il tipo. Il tipo di cliente è un'unione dei tipi RegisteredCustomer e GuestCustomer.

Schema di esempio

type Query {
  orderById(orderId: Int): Order
}

type Order {
  customerId: Int!
  orderId: Int!  
  customer: Customer
}

enum AccountType {
  Registered
  Guest
}

union Customer = RegisteredCustomer | GuestCustomer

type RegisteredCustomer {
  accountType: AccountType!
  customerId: Int!
  customerGuid: String!
  firstName: String!
  lastName: String!
  isActive: Boolean!
}

type GuestCustomer {
  accountType: AccountType!
  firstName: String!
  lastName: String!
}

Criterio di esempio

Per questo esempio si simulano i risultati del cliente da un'origine esterna e si impostano come hardcoded i risultati recuperati nel criterio set-body. Il campo __typename viene usato per determinare il tipo di cliente.

<http-data-source>
    <http-request>
        <set-method>GET</set-method>
        <set-url>https://data.contoso.com/orders/</set-url>
    </http-request>
    <http-response>
        <set-body>{"customerId": 12345, "accountType": "Registered", "__typename": "RegisteredCustomer" }
        </set-body>
    </http-response>
</http-data-source>

Per ulteriori informazioni sull'utilizzo dei criteri, vedere: