Compartilhar via


Fonte de dados HTTP para um resolvedor

APLICA-SE A: todas as camadas do Gerenciamento de API

A política de resolvedor http-data-source configura a solicitação HTTP e, opcionalmente, a resposta HTTP para resolver dados de um tipo de objeto e um campo em um esquema do GraphQL. O esquema deve ser importado para o Gerenciamento de API como uma API do GraphQL.

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

<http-data-source> 
    <http-request>
        <get-authorization-context>...get-authorization-context policy configuration...</get-authorization-context>
        <set-backend-service>...set-backend-service policy configuration...</set-backend-service>
        <set-method>...set-method policy configuration...</set-method> 
        <set-url>URL</set-url>
        <include-fragment>...include-fragment policy configuration...</include-fragment>
        <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> 
    <backend>
        <forward-request>...forward-request policy configuration...</forward-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>
        <publish-event>...publish-event policy configuration...</publish-event>
        <include-fragment>...include-fragment policy configuration...</include-fragment>
    </http-response>
</http-data-source> 

Elementos

Nome Descrição Obrigatório
http-request Especifica uma URL e políticas filho para configurar a solicitação HTTP do resolvedor. Sim
back-end Opcionalmente, encaminha a solicitação HTTP do resolvedor para um serviço de back-end, se especificado. Não
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. Não

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
get-authorization-context Obtém um contexto de autorização para a solicitação HTTP do resolvedor. Não
set-backend-service Redireciona a solicitação HTTP do resolvedor para o back-end especificado. Não
include-fragment Insere um fragmento de política na definição de política. Se houver vários cabeçalhos, adicione include-fragment elementos adicionais. Não
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

Elemento back-end

Elemento Descrição Obrigatório
forward-request Encaminha a solicitação HTTP do resolvedor para um serviço de back-end configurado. Não

Elementos http-response

Observação

Exceto quando indicado, 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
publish-event Publica um evento em uma ou mais assinaturas especificadas no esquema da API do GraphQL. Não
include-fragment Insere um fragmento de política na definição de política. Se houver vários cabeçalhos, adicione include-fragment elementos adicionais. Não

Uso

Observações de uso

  • Para configurar e gerenciar um resolvedor com essa política, confira Configurar um resolvedor do GraphQL.
  • Essa política é invocada somente ao resolver um só campo em um tipo de operação correspondente do GraphQL no esquema.

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

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

Resolvedor para uma consulta GraphQL 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

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

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

<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.GraphQL.Arguments;  
            JObject jsonObject = new JObject();
            jsonObject.Add("name", args["name"])
            return jsonObject.ToString();
        }</set-body>
    </http-request>
</http-data-source>

Resolução para o tipo de união do GraphQL

O exemplo a seguir resolve a consulta orderById fazendo uma chamada HTTP GET a uma fonte de dados de back-end e retorna um objeto JSON que inclui a ID do cliente e o tipo. O tipo de cliente é uma união dos tipos RegisteredCustomer e GuestCustomer.

Esquema de exemplo

type Query {
  orderById(orderId: Int): Order
}

type Order {
  customerId: Int!
  orderId: Int!  
  customer: Customer
}

enum AccountType {
  Registered
  Guest
}

union Customer = RegisteredCustomer | GuestCustomer

type RegisteredCustomer {
  accountType: AccountType!
  customerId: Int!
  customerGuid: String!
  firstName: String!
  lastName: String!
  isActive: Boolean!
}

type GuestCustomer {
  accountType: AccountType!
  firstName: String!
  lastName: String!
}

Política de exemplo

Neste exemplo, simularemos os resultados do cliente de uma fonte externa e codificaremos os resultados buscados na política set-body. O campo __typename é usado para determinar o tipo do cliente.

<http-data-source>
    <http-request>
        <set-method>GET</set-method>
        <set-url>https://data.contoso.com/orders/</set-url>
    </http-request>
    <http-response>
        <set-body>{"customerId": 12345, "accountType": "Registered", "__typename": "RegisteredCustomer" }
        </set-body>
    </http-response>
</http-data-source>

Para obter mais informações sobre como trabalhar com políticas, consulte: