Set GraphQL resolver (retirada)

Importante

  • La directiva set-graphql-resolver se ha retirado. Los clientes que usan la directiva set-graphql-resolver deben migrar a los solucionadores administrados para las API de GraphQL, que proporcionan una funcionalidad mejorada.
  • Después de configurar un solucionador administrado para un campo de GraphQL, la puerta de enlace omitirá la directiva set-graphql-resolver en cualquier definición de directiva. No puede combinar el uso de solucionadores administrados y la directiva set-graphql-resolver en la instancia de API Management.

La directiva set-graphql-resolver recupera o establece datos de un campo de GraphQL en un tipo de objeto especificado en un esquema de GraphQL. El esquema debe importarse a API Management. Actualmente, los datos deben resolverse mediante un origen de datos basado en HTTP (REST o API SOAP).

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

<set-graphql-resolver parent-type="type" field="field"> 
    <http-data-source> 
        <http-request> 
            <set-method>...set-method policy configuration...</set-method> 
            <set-url>URL</set-url>
            <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> 
        <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>
        </http-response>
      </http-data-source> 
</set-graphql-resolver> 

Atributos

Atributo Descripción Obligatorio Valor predeterminado
parent-type Tipo de objeto en el esquema de GraphQL. N/D
campo Campo del valor parent-type especificado en el esquema de GraphQL. N/D

Nota

Actualmente, esta directiva no valida los valores de parent-type y field. Si no son válidos, se omite la directiva y la consulta de GraphQL se reenvía a un punto de conexión de GraphQL (si es que se configura uno).

Elementos

Nombre Descripción Obligatorio
http-data-source Configura la solicitud HTTP y, opcionalmente, la respuesta HTTP que se usa para resolver los datos de los valores especificados parent-type y field.
http-request Especifica una dirección URL y directivas secundarias para configurar la solicitud HTTP del solucionador.
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.

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

elementos http-response

Nota

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

Uso

Notas de uso

  • Esta directiva solo se invoca cuando se ejecuta una consulta coincidente de GraphQL.
  • La directiva resuelve los datos de un único campo. Para resolver los datos de varios campos, configure varias repeticiones de esta directiva en una definición de directiva.

Contexto de GraphQL

  • El contexto de la solicitud HTTP y el de la respuesta HTTP (si se especifica) difieren del contexto de la solicitud de API de la puerta de enlace original:
    • context.ParentResult se establece en el objeto primario para la ejecución del revolvedor actual.
    • El contexto de la solicitud HTTP contiene argumentos que se pasan en la consulta de GraphQL como su cuerpo.
    • El contexto de respuesta HTTP es la respuesta de la llamada HTTP independiente que realiza el solucionador, no el contexto de la respuesta completa para la solicitud de puerta de enlace. La variable context que pasa a través de la canalización de solicitud y respuesta se aumenta con el contexto de GraphQL cuando se usa con las directivas de <set-graphql-resolver>.

ParentResult

context.ParentResult se establece en el objeto primario para la ejecución del revolvedor actual. Fíjese en el siguiente esquema parcial:

type Comment {
    id: ID!
    owner: string!
    content: string!
}

type Blog {
    id: ID!
    title: string!
    content: string!
    comments: [Comment]!
    comment(id: ID!): Comment
}

type Query {
    getBlog(): [Blog]!
    getBlog(id: ID!): Blog
}

Además, considere la posibilidad de usar una consulta de GraphQL para toda la información de un blog específico:

query {
    getBlog(id: 1) {
        title
        content
        comments {
            id
            owner
            content
        }
    }
}

Si establece un resolvedor para parent-type="Blog" field="comments", tendrá que comprender qué identificador de blog usar. Puede obtener el identificador del blog mediante context.ParentResult.AsJObject()["id"].ToString(). La directiva para configurar este resolvedor sería similar a la siguiente:

<set-graphql-resolver parent-type="Blog" field="comments">
    <http-data-source>
        <http-request>
            <set-method>GET</set-method>
            <set-url>@{
                var blogId = context.ParentResult.AsJObject()["id"].ToString();
                return $"https://data.contoso.com/api/blog/{blogId}";
            }</set-url>
        </http-request>
    </http-data-source>
</set-graphql-resolver>

Argumentos

Los argumentos de una consulta de GraphQL parametrizada se agregan al cuerpo de la solicitud. Por ejemplo, tome en cuenta las dos consultas siguientes:

query($id: Int) {
    getComment(id: $id) {
        content
    }
}

query {
    getComment(id: 2) {
        content
    }
}

Estas consultas son dos maneras de llamar al resolvedor getComment. GraphQL envía la siguiente carga de JSON:

{
    "query": "query($id: Int) { getComment(id: $id) { content } }",
    "variables": { "id": 2 }
}

{
    "query": "query { getComment(id: 2) { content } }"
}

Cuando se ejecuta el resolvedor, la propiedad arguments se agrega al cuerpo. Puede definir el resolvedor de la siguiente manera:

<set-graphql-resolver parent-type="Blog" field="comments">
    <http-data-source>
        <http-request>
            <set-method>GET</set-method>
            <set-url>@{
                var commentId = context.Request.Body.As<JObject>(true)["arguments"]["id"];
                return $"https://data.contoso.com/api/comment/{commentId}";
            }</set-url>
        </http-request>
    </http-data-source>
</set-graphql-resolver>

Más 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

<set-graphql-resolver parent-type="Query" field="users">
    <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>
</set-graphql-resolver>

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

<set-graphql-resolver parent-type="Query" field="users">
    <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>
</set-graphql-resolver>

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

<set-graphql-resolver parent-type="Mutation" field="makeUser">
    <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.Request.Body.As<JObject>(true)["arguments"];  
                JObject jsonObject = new JObject();
                jsonObject.Add("name", args["name"])
                return jsonObject.ToString();
            }</set-body>
        </http-request>
    </http-data-source>
</set-graphql-resolver>

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