Definir o resolvedor GraphQL (desativado)

Importante

  • A política set-graphql-resolver foi desativada. Os clientes que usam a política set-graphql-resolver devem migrar para os resolvedores gerenciados das APIs do GraphQL, que fornecem funcionalidade aprimorada.
  • Depois de configurar um resolvedor gerenciado para um campo do GraphQL, o gateway ignora a política set-graphql-resolver em qualquer definição de política. Você não pode combinar o uso de resolvedores gerenciados e a política set-graphql-resolver em sua instância de Gerenciamento de API.

A política set-graphql-resolver recupera ou define dados para um campo do GraphQL em um tipo de objeto especificado em um esquema do GraphQL. O esquema deve ser importado para o Gerenciamento de API. Atualmente, os dados devem ser resolvidos usando uma fonte de dados baseada em HTTP (API REST ou SOAP).

Observação

Defina os elementos da política e os elementos filho na ordem fornecida na declaração da política. Saiba mais sobre como definir e editar as políticas de Gerenciamento 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 Padrão
parent_type Um tipo de objeto no esquema do GraphQL. Sim N/D
field Um campo do parent-type especificado no esquema do GraphQL. Sim N/D

Observação

Atualmente, os valores de parent-type e field não são validados por essa política. Se não forem válidos, a política será ignorada e a consulta do GraphQL será encaminhada para um ponto de extremidade do GraphQL (se um estiver configurado).

Elementos

Nome Descrição Obrigatório
http-data-source Configura a solicitação HTTP e, opcionalmente, a resposta HTTP usada para resolver dados para o parent-type e o field determinados. Sim
http-request Especifica uma URL e políticas filho para configurar a solicitação HTTP do resolvedor. Sim
http-response Opcionalmente, especifica políticas filho para configurar a resposta HTTP do resolvedor. Se não for especificada, a resposta será retornada como uma cadeia de caracteres bruta.

Elementos http-request

Observação

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

Elemento Descrição Obrigatório
set-method Define o método da solicitação HTTP do resolvedor. Sim
set-url Define a URL da solicitação HTTP do resolvedor. Yes
set-header Define um cabeçalho na solicitação HTTP do resolvedor. Se houver vários cabeçalhos, adicione header elementos adicionais. Não
set-body Define o corpo na solicitação HTTP do resolvedor. Não
authentication-certificate Autentica-se usando um certificado do cliente na solicitação HTTP do resolvedor. Não

Elementos http-response

Observação

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

Nome Descrição Obrigatório
set-body Define o corpo na resposta HTTP do resolvedor. Não
xml-to-json Transforma a resposta HTTP do resolvedor de XML em JSON. Não
find-and-replace Localiza uma substring na resposta HTTP do resolvedor e a substitui por uma substring diferente. Não

Uso

Observações de uso

  • Essa política é invocada somente quando uma consulta correspondente do GraphQL é executada.
  • A política resolve dados para um único campo. Para resolver dados para vários campos, configure várias ocorrências dessa política em uma definição de política.

Contexto do GraphQL

  • O contexto da solicitação HTTP e da resposta HTTP (se especificada) difere do contexto da solicitação de API de gateway original:
    • context.ParentResult é definido como o objeto pai para a execução atual do resolvedor.
    • O contexto da solicitação HTTP contém argumentos que são transmitidos na consulta do GraphQL como o corpo.
    • O contexto da resposta HTTP é a resposta da chamada HTTP independente feita pelo resolvedor, não o contexto da resposta completa da solicitação de gateway. A variável context passada por meio dos pipelines de solicitação e de resposta é aumentada com o contexto do GraphQL, quando usada com as políticas <set-graphql-resolver>.

ParentResult

O context.ParentResult é definido como o objeto pai para a execução atual do resolvedor. Considere o esquema parcial a seguir:

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 blog específico:

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

Se você definir um resolvedor para parent-type="Blog" field="comments", convém compreender qual ID de blog deve ser usada. Você pode obter a ID de blog usando context.ParentResult.AsJObject()["id"].ToString(). A política para configurar esse resolvedor seria semelhante 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 para uma consulta GraphQL parametrizada são adicionados ao corpo da solicitação. Por exemplo, considere as duas consultas a seguir:

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

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

Essas consultas são duas maneiras de chamar o resolvedor getComment. 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 o resolvedor é executado, a propriedade arguments é adicionada ao corpo. Você pode definir o resolvedor da seguinte maneira:

<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

Resolvedor para consultas do GraphQL

O exemplo a seguir resolve uma consulta fazendo uma chamada HTTP GET para uma fonte 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>

O resolvedor de uma consulta do GraqhQL que retorna uma lista usando um modelo líquido

O exemplo a seguir usa um modelo líquido, com suporte para uso na política set-body, a fim de retornar uma lista na resposta HTTP a uma consulta. Essa ação também renomeia o campo username 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>

Resolvedor para a mutação do GraphQL

O exemplo a seguir resolve uma mutação que insere dados fazendo uma solicitação POST a uma fonte de dados HTTP. A expressão de política na política set-body da solicitação HTTP modifica um argumento name que é transmitido na consulta do GraphQL como o corpo. O corpo enviado será semelhante ao seguinte 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: