Definir o resolvedor GraphQL (desativado)
Importante
- A política
set-graphql-resolver
foi desativada. Os clientes que usam a políticaset-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íticaset-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
- Seções de política: back-end
- Escopos de política: global, espaço de trabalho, produto, API, operação
- Gateways: dedicados
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>
Políticas relacionadas
Conteúdo relacionado
Para obter mais informações sobre como trabalhar com políticas, consulte:
- Tutorial: Transformar e proteger sua API
- Referência de Política para uma lista completa das instruções de política e suas configurações
- Expressões de política
- Definir ou editar políticas
- Reutilizar configurações de política
- Repositório de snippets de política
- Criar políticas usando o Microsoft Copilot para Azure