Definir resolução do GraphQL (descontinuada)
Importante
- A
set-graphql-resolver
política foi descontinuada. Os clientes que utilizam aset-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 aset-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
- Secções de política: back-end
- Âmbitos de política: global, área de trabalho, produto, API, operação
- Gateways: dedicados
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>
Políticas relacionadas
Conteúdo relacionado
Para obter mais informações sobre como trabalhar com políticas, consulte:
- Tutorial: Transformar e proteger a sua API
- Referência de política para uma lista completa de declarações de política e respetivas definições
- Expressões de política
- Definir ou editar políticas
- Reutilizar configurações de políticas
- Repositório de fragmentos de política
- Criar políticas com o Microsoft Copilot para o Azure