Partage via


Source de données HTTP pour un résolveur

S’APPLIQUE À : tous les niveaux de Gestion des API

La stratégie du résolveur http-data-source configure la requête HTTP et éventuellement la réponse HTTP pour résoudre les données d’un type d’objet et d’un champ dans un schéma GraphQL. Le schéma doit être importé dans API Management en tant qu’API GraphQL.

Notes

Définissez les éléments enfants et de stratégie dans l’ordre fourni dans l’instruction de stratégie. En savoir plus sur comment définir ou modifier des stratégies du service Gestion des API.

Instruction de la stratégie

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

Éléments

Nom Description Obligatoire
http-request Spécifie une URL et des stratégies enfants pour configurer la requête HTTP du résolveur. Oui
Serveur principal Transfère éventuellement la requête HTTP du résolveur à un service principal, si spécifié. Non
http-response (Facultatif) Spécifie les stratégies enfants pour configurer la réponse HTTP du résolveur. S’il n’est pas spécifié, la réponse est retournée sous forme de chaîne brute. Non

Éléments http-request

Notes

Sauf mention contraire, chaque élément enfant ne peut être spécifié qu’une fois. Indiquez les éléments dans l’ordre indiqué.

Élément Description Obligatoire
get-authorization-context Obtient un contexte d’autorisation pour la requête HTTP du résolveur. Non
set-backend-service Redirige la requête HTTP du résolveur vers le serveur principal spécifié. Non
include-fragment Insère un fragment de stratégie dans la définition de la stratégie. S’il existe plusieurs fragments, ajoutez les éléments include-fragment supplémentaires. Non
set-method Définit la méthode de la requête HTTP du résolveur. Oui
set-url Définit l’URL de la requête HTTP du résolveur. Oui
set-header Définit un en-tête dans la requête HTTP du résolveur. S’il existe plusieurs en-têtes, ajoutez des éléments header supplémentaires. Non
set-body Définit le corps dans la requête HTTP du résolveur. Non
authentication-certificate S’authentifie à l’aide d’un certificat client dans la requête HTTP du résolveur. Non

élément principal

Élément Description Obligatoire
forward-request Transfère la requête HTTP du résolveur à un service principal configuré. Non

Éléments http-response

Notes

Sauf mention contraire, chaque élément enfant ne peut être spécifié qu’une fois. Indiquez les éléments dans l’ordre indiqué.

Nom Description Obligatoire
set-body Définit le corps dans la réponse HTTP du résolveur. Non
xml-to-json Transforme la réponse HTTP du résolveur de XML en JSON. Non
find-and-replace Recherche un substring dans la réponse HTTP du résolveur et la remplace par un autre substring. Non
publish-event Publie un événement dans un ou plusieurs abonnements spécifiés dans le schéma de l’API GraphQL. Non
include-fragment Insère un fragment de stratégie dans la définition de la stratégie. S’il existe plusieurs fragments, ajoutez les éléments include-fragment supplémentaires. Non

Usage

Notes d’utilisation

  • Pour configurer et gérer un programme de résolution avec cette stratégie, reportez-vous à Configurer un programme de résolution de GraphQL.
  • Cette stratégie est invoquée uniquement lors de la résolution d’un champ unique dans un type d’opération GraphQL correspondant dans le schéma.

Exemples

Résolveur d’une requête GraphQL

L’exemple suivant résout une requête en effectuant un appel HTTP GET à une source de données back-end.

Exemple de schéma

type Query {
    users: [User]
}

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

Exemple de stratégie

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

Résolveur d’une requête GraphQL qui retourne une liste, à l’aide d’un modèle liquide

L’exemple suivant utilise un modèle liquide (dont l’utilisation est prise en charge dans la stratégie set-body) pour renvoyer une liste dans la réponse HTTP à une requête. Il renomme également le champ username dans la réponse de l’API REST en name dans la réponse GraphQL.

Exemple de schéma

type Query {
    users: [User]
}

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

Exemple de stratégie

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

Résolveur de la mutation GraphQL

L’exemple suivant résout une mutation qui insère des données en effectuant une requête POST à une source de données HTTP. L’expression de la stratégie set-body de la requête HTTP modifie un argument name transmis dans le corps de la requête GraphQL. Le corps envoyé se présente comme le code JSON suivant :

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

Exemple de schéma

type Query {
    users: [User]
}

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

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

Exemple de stratégie

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

Résolveur du type union GraphQL

L’exemple suivant résout la requête orderById en effectuant un appel GET HTTP à une source de données de back-end, et renvoie un objet JSON qui inclut l’ID et le type du client. Le type de client est une union des types RegisteredCustomer et GuestCustomer.

Exemple de schéma

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

Exemple de stratégie

Pour cet exemple, nous simulons les résultats du client à partir d’une source externe et nous codons en dur les résultats récupérés dans la stratégie set-body. Le champ __typename est utilisé pour déterminer le type du client.

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

Pour plus d’informations sur l’utilisation des stratégies, consultez :