Origen de datos HTTP para una resolución

SE APLICA A: todos los niveles de API Management

La directiva de resolución http-data-source configura la solicitud HTTP y, opcionalmente, la respuesta HTTP para resolver los datos de un tipo de objeto y un campo en un esquema GraphQL. El esquema debe importarse a API Management como una API de GraphQL.

Nota:

Establezca los elementos de la directiva y los elementos secundarios en el orden proporcionado en la instrucción de directiva. Obtenga más información sobre el establecimiento o modificación de directivas de API Management.

Instrucción de la directiva

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

Elementos

Nombre Descripción Obligatorio
http-request Especifica una dirección URL y directivas secundarias para configurar la solicitud HTTP del solucionador.
back-end Opcionalmente, reenvía la solicitud HTTP del solucionador a un servicio back-end, si se especifica. No
http-response Opcionalmente, especifica las directivas secundarias para configurar la respuesta HTTP del solucionador. Si no se especifica, la respuesta se devuelve como una cadena sin formato. No

elementos http-request

Nota

Excepto donde se indique, cada elemento secundario se puede especificar como máximo una vez. Especificar los elementos en el orden enumerado.

Elemento Descripción Obligatorio
get-authorization-context Obtiene un contexto de autorización para la solicitud HTTP del solucionador. No
set-backend-service Redirige la solicitud HTTP del solucionador al back-end especificado. No
include-fragment Inserta un fragmento de la directiva en la definición de directiva. Si hay varios fragmentos, agregue elementos include-fragment adicionales. No
set-method Establecer el método de la solicitud HTTP de la resolución.
set-url Establece la URL de la solicitud HTTP de la resolución.
set-header Establece un encabezado en la solicitud HTTP de la resolución. Si hay varios encabezados, agrega elementos header adicionales. No
set-body Establece el cuerpo en la solicitud HTTP de la resolución. No
authentication-certificate Se autentica mediante un certificado de cliente en la solicitud HTTP de la resolución. No

elemento back-end

Elemento Descripción Obligatorio
forward-request Reenvía la solicitud HTTP del solucionador a un servicio back-end configurado. No

elementos http-response

Nota

Excepto donde se indique, cada elemento secundario se puede especificar como máximo una vez. Especificar los elementos en el orden enumerado.

Nombre Descripción Obligatorio
set-body Establece el cuerpo en la respuesta HTTP de la resolución. No
xml-to-json Transforma la respuesta HTTP de la resolución de XML a JSON. No
find-and-replace Busca una substring en la respuesta HTTP de la resolución y la reemplaza por una substring diferente. No
publish-event Publica un evento en una o varias suscripciones especificadas en el esquema de GraphQL API. No
include-fragment Inserta un fragmento de la directiva en la definición de directiva. Si hay varios fragmentos, agregue elementos include-fragment adicionales. No

Uso

Notas de uso

Ejemplos

Resolución de consultas de GraphQL

En el ejemplo siguiente se resuelve una consulta realizando una llamada HTTP GET a un origen de datos back-end.

Esquema de ejemplo

type Query {
    users: [User]
}

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

Ejemplo de directiva

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

Resolución de una consulta de GraphQL que devuelve una lista mediante una plantilla líquida

En el ejemplo siguiente se usa una plantilla líquida que se puede usar en la directiva set-body, para devolver una lista en la respuesta HTTP a una consulta. También cambia el nombre del campo username de la respuesta de la API de REST a name en la respuesta de GraphQL.

Esquema de ejemplo

type Query {
    users: [User]
}

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

Ejemplo de directiva

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

Resolución para la mutación de GraphQL

En el ejemplo siguiente se resuelve una mutación que inserta datos mediante la realización de una solicitud POST a un origen de datos HTTP. La expresión de directiva en la directiva set-body de la solicitud HTTP modifica un argumento name que se pasa en la consulta de GraphQL como su cuerpo. El cuerpo que se envía tendrá un aspecto similar al siguiente JSON:

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

Esquema de ejemplo

type Query {
    users: [User]
}

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

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

Ejemplo de directiva

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

Resolución del tipo de unión GraphQL

En el ejemplo siguiente se resuelve la consulta de orderById mediante la realización de una llamada HTTP GET a un origen de datos back-end y se devuelve un objeto JSON que incluye el identificador de cliente y el tipo. El tipo de cliente es una unión de tipos de RegisteredCustomer y GuestCustomer.

Esquema de ejemplo

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

Ejemplo de directiva

En este ejemplo, simulamos los resultados del cliente de un origen externo y codificamos de forma rígida los resultados capturados en la directiva de set-body. El campo __typename se usa para determinar el tipo del 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>

Para más información sobre el trabajo con directivas, vea: