Установка сопоставителя GraphQL (прекращено)

Важно!

  • Политика set-graphql-resolver прекращается. Клиенты, set-graphql-resolver использующие политику, должны перейти на управляемые сопоставители для GraphQL API, которые предоставляют расширенные функциональные возможности.
  • После настройки управляемого сопоставителя для поля GraphQL шлюз пропускает set-graphql-resolver политику в любых определениях политик. Нельзя сочетать использование управляемых сопоставителей и политики в экземпляре set-graphql-resolver Управление API.

Политикаset-graphql-resolver извлекает или задает данные для поля GraphQL в типе объекта, указанном в схеме GraphQL. Схема должна быть импортирована в Управление API. В настоящее время данные должны быть разрешены с помощью источника данных на основе HTTP (REST или API SOAP).

Примечание

Задайте элементы политики и дочерние элементы в порядке, указанном в правиле политики. Узнайте, как устанавливать или изменять политики Управления API.

Правило политики

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

Атрибуты

Атрибут Описание Обязательно Значение по умолчанию
родительский тип Тип объекта в схеме GraphQL. Да Н/Д
поле Поле указанного parent-type в схеме GraphQL. Да Н/Д

Примечание

В настоящее время значения parent-type и field не проверяются этой политикой. Если они недопустимы, политика игнорируется, а запрос GraphQL перенаправляются в конечную точку GraphQL (если она настроена).

Элементы

Название Описание Обязательно
http-data-source Настраивает HTTP-запрос и при необходимости HTTP-ответ, используемый для разрешения данных для заданного parent-type и field. Да
http-request Указывает URL-адрес и дочерние политики для настройки HTTP-запроса сопоставителя. Да
http-response При необходимости указывает дочерние политики для настройки HTTP-ответа сопоставителя. Если значение не указано, ответ возвращается в виде необработанной строки.

Элементы http-request

Примечание

За исключением случаев, когда указано, каждый дочерний элемент может быть указан не более одного раза. Укажите элементы в указанном порядке.

Элемент Описание Обязательно
set-method Задает метод HTTP-запроса сопоставителя. Да
set-url Задает URL-адрес HTTP-запроса сопоставителя. Да
set-header Задает заголовок в HTTP-запросе сопоставителя. Если заголовков несколько, добавьте дополнительные header элементы. Нет
set-body Задает текст в HTTP-запросе сопоставителя. Нет
authentication-certificate Выполняет проверку подлинности с помощью сертификата клиента в HTTP-запросе сопоставителя. Нет

Элементы http-response

Примечание

Каждый дочерний элемент может быть указан не более одного раза. Укажите элементы в указанном порядке.

Имя Описание Обязательно
set-body Задает текст в HTTP-ответе сопоставителя. Нет
xml-to-json Преобразует HTTP-ответ сопоставителя из XML в JSON. Нет
find-and-replace Находит подстроку в HTTP-ответе сопоставителя и заменяет ее другой подстрокой. Нет

Использование

Примечания об использовании

  • Эта политика вызывается только при выполнении соответствующего запроса GraphQL.
  • Политика разрешает данные для одного поля. Чтобы разрешать данные для нескольких полей, настройте несколько экземпляров этой политики в определении политики.

контекст GraphQL

  • Контекст HTTP-запроса и HTTP-ответа (если он указан) отличается от контекста исходного запроса API шлюза:
    • В качестве значения context.ParentResult задается родительский объект для текущего выполнения сопоставителя.
    • Контекст HTTP-запроса содержит аргументы, передаваемые в запросе GraphQL в качестве основного текста.
    • Контекст ответа HTTP — это ответ от независимого HTTP-вызова, выполненного сопоставителем, а не контекст для полного ответа на запрос шлюза. При использовании с политиками <set-graphql-resolver> переменная context, передаваемая через конвейер запросов и ответов, дополняется контекстом GraphQL.

ParentResult

В качестве значения context.ParentResult задается родительский объект для текущего выполнения сопоставителя. Рассмотрим следующую частичную схему:

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
}

Также рассмотрим запрос GraphQL для всех сведений для определенного блога:

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

Если задан сопоставитель для parent-type="Blog" field="comments", вы захотите узнать, какой идентификатор блога следует использовать. Идентификатор блога можно получить с помощью context.ParentResult.AsJObject()["id"].ToString(). Политика настройки этого сопоставителя будет выглядеть следующим образом:

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

Аргументы

Аргументы для параметризованного запроса GraphQL добавляются в текст запроса. Например, рассмотрим следующие два запроса:

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

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

С их помощью можно вызвать сопоставитель getComment. GraphQL отправляет следующие полезные данные JSON:

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

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

При выполнении сопоставителя свойство arguments добавляется в текст. Сопоставитель можно определить следующим образом:

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

Дополнительные примеры

Сопоставитель для запроса GraphQL

В следующем примере запрос разрешается путем вызова HTTP GET к внутреннему источнику данных.

Пример схемы

type Query {
    users: [User]
}

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

Пример политики

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

Сопоставитель для запроса GraqhQL, который возвращает список с помощью шаблона liquid

В следующем примере используется шаблон liquid, поддерживаемый для использования в политике set-body, для возврата списка в http-ответе на запрос. Он также переименовывает поле username в ответе от REST API в name в ответе GraphQL.

Пример схемы

type Query {
    users: [User]
}

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

Пример политики

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

Сопоставитель для изменения GraphQL

В следующем примере устранена мутация, которая вставляет данные, выполняя POST запрос к источнику данных HTTP. Выражение политики в политике set-body HTTP-запроса изменяет name аргумент, передаваемый в запросе GraphQL в качестве его сообщения. Отправляемый текст будет выглядеть как следующий JSON:

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

Пример схемы

type Query {
    users: [User]
}

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

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

Пример политики

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

Дополнительные сведения о работе с политиками см. в нижеуказанных статьях.