Set GraphQL resolver (retirada)
Importante
- La directiva
set-graphql-resolver
se ha retirado. Los clientes que usan la directivaset-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 directivaset-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. | Sí | N/D |
campo | Campo del valor parent-type especificado en el esquema de GraphQL. |
Sí | 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 . |
Sí |
http-request | Especifica una dirección URL y directivas secundarias para configurar la solicitud HTTP del solucionador. | Sí |
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. | Sí |
set-url | Establece la URL de la solicitud HTTP de la resolución. | Sí |
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
- Secciones de la directiva: back-end
- Ámbitos de la directiva: global, área de trabajo, producto, API, operación
- Puertas de enlace: dedicadas
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>
Directivas relacionadas
Contenido relacionado
Para más información sobre el trabajo con directivas, vea:
- Tutorial: Transformación y protección de una API
- Referencia de directivas para una lista completa de instrucciones de directivas y su configuración
- Expresiones de directiva
- Establecimiento o edición de directivas
- Reutilización de configuraciones de directivas
- Repositorio de fragmentos de código de directiva
- Creación de directivas con Microsoft Copilot para Azure