Definir resolução do GraphQL (descontinuada)

Importante

  • A set-graphql-resolver política foi descontinuada. Os clientes que utilizam a set-graphql-resolver política têm de migrar para as resoluções geridas das APIs do GraphQL, que fornecem funcionalidades melhoradas.
  • Depois de configurar uma resolução gerida para um campo GraphQL, o gateway ignora a set-graphql-resolver política em quaisquer definições de política. Não pode combinar a utilização de resoluções geridas e a set-graphql-resolver política na sua instância de Gestão de API.

A set-graphql-resolver política obtém ou define dados para um campo GraphQL num tipo de objeto especificado num esquema GraphQL. O esquema tem de ser importado para Gestão de API. Atualmente, os dados têm de ser resolvidos com uma origem de dados baseada em HTTP (REST ou SOAP API).

Nota

Defina os elementos da política e os elementos subordinados na ordem fornecida na declaração de política. Saiba mais sobre como definir ou editar políticas de Gestão de API.

Declaração de política

<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 Descrição Obrigatório Predefinição
tipo principal Um tipo de objeto no esquema GraphQL. Yes N/D
campo Um campo do especificado parent-type no esquema GraphQL. Yes N/D

Nota

Atualmente, os valores de parent-type e field não são validados por esta política. Se não forem válidas, a política é ignorada e a consulta GraphQL é reencaminhada para um ponto final do GraphQL (se estiver configurada).

Elementos

Nome Descrição Obrigatório
http-data-source Configura o pedido HTTP e, opcionalmente, a resposta HTTP que são utilizadas para resolver dados para o especificado parent-type e field. Yes
http-request Especifica um URL e políticas subordinadas para configurar o pedido HTTP da resolução. Yes
http-response Opcionalmente, especifica políticas subordinadas para configurar a resposta HTTP da resolução. Se não for especificado, a resposta é devolvida como uma cadeia não processada.

elementos de pedido http

Nota

Exceto quando indicado, cada elemento subordinado pode ser especificado, no máximo, uma vez. Especifique os elementos na ordem listada.

Elemento Descrição Obrigatório
set-method Define o método do pedido HTTP da resolução. Yes
set-url Define o URL do pedido HTTP da resolução. Yes
set-header Define um cabeçalho no pedido HTTP da resolução. Se existirem vários cabeçalhos, adicione elementos adicionais header . No
set-body Define o corpo no pedido HTTP da resolução. No
autenticação-certificado Autentica com um certificado de cliente no pedido HTTP da resolução. No

elementos de resposta http

Nota

Cada elemento subordinado pode ser especificado no máximo uma vez. Especifique os elementos na ordem listada.

Nome Descrição Obrigatório
set-body Define o corpo na resposta HTTP da resolução. No
xml-to-json Transforma a resposta HTTP da resolução de XML para JSON. No
localizar e substituir Localiza uma subcadeia na resposta HTTP da resolução e substitui-a por uma subcadeia diferente. No

Utilização

Notas de utilização

  • Esta política é invocada apenas quando é executada uma consulta GraphQL correspondente.
  • A política resolve os dados de um único campo. Para resolver dados de vários campos, configure várias ocorrências desta política numa definição de política.

Contexto do GraphQL

  • O contexto do pedido HTTP e da resposta HTTP (se especificado) difere do contexto do pedido original da API de gateway:
    • context.ParentResult está definido como o objeto principal para a execução da resolução atual.
    • O contexto do pedido HTTP contém argumentos que são transmitidos na consulta GraphQL como o respetivo corpo.
    • O contexto de resposta HTTP é a resposta da chamada HTTP independente efetuada pela resolução e não o contexto da resposta completa para o pedido de gateway. A context variável que é transmitida através do pipeline de pedido e resposta é aumentada com o contexto do GraphQL quando utilizada com <set-graphql-resolver> políticas.

ParentResult

O context.ParentResult está definido como o objeto principal para a execução da resolução atual. Considere o seguinte 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
}

Além disso, considere uma consulta GraphQL para todas as informações de um blogue específico:

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

Se definir uma resolução para parent-type="Blog" field="comments", irá querer compreender qual o ID do blogue a utilizar. Pode obter o ID do blogue com context.ParentResult.AsJObject()["id"].ToString(). A política para configurar esta resolução assemelhar-se-ia a:

<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

Os argumentos de uma consulta GraphQL parametrizada são adicionados ao corpo do pedido. Por exemplo, considere as duas consultas seguintes:

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

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

Estas consultas são duas formas de chamar a getComment resolução. O GraphQL envia o seguinte payload JSON:

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

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

Quando a resolução é executada, a arguments propriedade é adicionada ao corpo. Pode definir a resolução da seguinte forma:

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

Mais exemplos

Resolver para consulta do GraphQL

O exemplo seguinte resolve uma consulta ao fazer uma chamada HTTP GET para uma origem de dados de back-end.

Esquema de exemplo

type Query {
    users: [User]
}

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

Política de exemplo

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

Resolver uma consulta GraqhQL que devolve uma lista com um modelo líquido

O exemplo seguinte utiliza um modelo líquido, suportado para utilização na política set-body , para devolver uma lista na resposta HTTP a uma consulta. Também muda o nome do username campo na resposta da API REST para name na resposta do GraphQL.

Esquema de exemplo

type Query {
    users: [User]
}

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

Política de exemplo

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

Resolver a mutação do GraphQL

O exemplo seguinte resolve uma mutação que insere dados ao fazer um pedido a uma POST origem de dados HTTP. A expressão de política na set-body política do pedido HTTP modifica um name argumento transmitido na consulta GraphQL como o seu corpo. O corpo que é enviado terá o seguinte aspeto JSON:

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

Esquema de exemplo

type Query {
    users: [User]
}

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

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

Política de exemplo

<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 obter mais informações sobre como trabalhar com políticas, consulte: