Internal API Call

O interceptor Internal API Call permite invocar uma chamada interna com base nas configurações estabelecidas.

Exemplo de uso:

Imagine que, para uma determinada API chamada "ConsultaInformacaoVenda", você necessite que a requisição passe por uma autenticação simples de login/senha. Você já tem uma API para esse tipo de autenticação, chamada "AutenticaUsuario", que deve estar cadastrada previamente.

Como você já tem uma API exposta ("ConsultaInformacaoVenda") e também já conta com uma API que faz todo o controle de autenticação, não se faz necessário replicarmos a lógica de autenticação para dentro do fluxo da API exposta. Ao invés disso, podemos adicionar o interceptor API Internal Call no fluxo da API "ConsultaInformacaoVenda", que redirecionará as requisições da "ConsultaInformacaoVenda" para a "AutenticaUsuario". Com base no retorno da autenticação, o interceptor então decidirá se irá continuar ou abortar o processo.

Configurando o interceptor

Para configurar este interceptor, basta arrastá-lo para o fluxo de requisição e preencher os campos com as informações desejadas, como mostrado na imagem abaixo.

Não é possível utilizar este interceptor no fluxo de resposta, apenas no de requisição.
mediation internal api call
  • Variable Name: define o nome do interceptor Internal API Call, sendo único por fluxo. É através dessa nomenclatura que a resposta da chamada pode ser recuperada de dentro do mapa $call.contextVariables, sendo necessário um custom interceptor para isso, como mostrado abaixo.

  • API: API que será invocada.

  • Revision: revisão da API que será invocada.

  • Resource: recurso a ser invocado.

  • Operation: operação a ser realizada.

Só é possível invocar uma API que esteja implantada no mesmo ambiente da API em cujo fluxo você está adicionando o interceptor.

Se pensarmos nas APIs do exemplo de uso acima, para chamar a API "AutenticaUsuario" é necessário que ela esteja implantada no mesmo ambiente que a API "ConsultaInformacaoVenda", que é a API que contém o interceptor Internal API Call.

Se você quiser invocar uma API que não esteja implantada no mesmo ambiente, primeiro faça o deploy dela no ambiente desejado. Lembre-se que é possível implantar uma API em mais de um ambiente ao mesmo tempo. Você pode ler mais sobre como fazer o deploy de APIs aqui.

  • Preserve Query String: se a opção for marcada, a query string presente na requisição será repassada para a API que será chamada internamente.

  • Query: permite a inserção de query string.

  • Preserve Path Param: se a opção for marcada, o path param presente na requisição será repassado para a API que será chamada internamente.

  • Path Param: permite a inserção de path param.

  • Preserve Body: se a opção for marcada, o body contido na requisição será repassado para a API que será chamada internamente. O campo é habilitado quando o método for diferente de GET.

  • Body: permite a inserção de um body. O campo é habilitado quando o método for diferente de GET e o campo Preserve Body estiver desmarcado.

  • Preserve Headers: se marcado, os headers presentes na requisição serão repassados para a API que será chamada internamente.

  • Headers: permite a inserção de headers.

O header de Transfer-Encoding é removido quando a requisição trafega pelo gateway, tanto em response como em request. Para mais informações sobre a remoção de headers, clique aqui.

Funcionamento

Para mostrar o funcionamento do Internal API Call, vamos considerar o seguinte caso:

Uma organização, a LSA (Lost Souls' Alliance), irá desenvolver uma API central, a LSA Communication, que será capaz de enviar, via POST, uma mesma mensagem (ou comando) para pessoas de dentro e de fora da organização. Essa API será registrada sob o domínio lsa.org.mx.

A mensagem, enviada como um JSON no body da chamada, será:

{
  "message": "Join or Die! Viva la revolución!",
  "author": "Salvador Limones"
}

No caso da comunicação interna, já existe uma API exposta que faz o envio da mensagem pelo sistema interno (radio-messages) e agrega as respostas: a LSA Internal Communication. Para aproveitar essa API, já implantada no mesmo ambiente da LSA Communication, utilizamos o Internal API Call.

As imagens a seguir mostram, respectivamente, a sequência dos interceptores no fluxo da API e as configurações utilizadas no Internal API Call:

mediation internal api call flow
mediation internal api call config

A LSA Internal Communication retorna, com código de status 200, o seguinte body[1]:

{
  "messages": [
    {
      "message": "I've already joined, Sal, a year ago. Is this just a test message?",
      "author": "Eva"
    }
  ]
}

Após a chamada, o interceptor irá retornar um objeto do tipo ApiResponse que será armazenado nas variáveis de contexto da chamada. Para recuperar a resposta, é necessário criar um custom interceptor que acesse $call.contextVariables.get(“Variable Name”).

Abaixo está o código do custom JavaScript interceptor que será usado para capturar a resposta e incluir o body e o status na resposta final:

// Captura a resposta do Internal API Call
var respRadio = $call.contextVariables.get('radioMessages');

// Cria um objeto ApiResponse para essa chamada
$call.response = new com.sensedia.interceptor.externaljar.dto.ApiResponse();
$call.response.addHeader('Content-Type', 'application/json');

// Template JSON para a mensagem retornada
var respBody = JSON.parse('{"radio": {"status": 0, "body": {}}}');

// O status retornado é um Object, não um Number
var statusRadio = respRadio.getStatus();

// O método intValue é chamado para obter um objeto Number
respBody.radio.status = statusRadio.intValue();

// O body é inserido apenas se o status retornado for 200
if (statusRadio == 200){
    respBody.radio.body = JSON.parse(respRadio.getBody().getString("UTF-8"));
}

// Injeta o body modificado na ApiResponse
$call.response.getBody().setString(JSON.stringify(respBody), "UTF-8");

// Define o status de retorno como 200
$call.response.setStatus(200);

Por fim, o body da resposta da chamada POST ao recurso internal-messages da LSA Communication será:

{
  "radio": {
    "status": 200,
    "body": {
      "messages": [
        {
          "message": "I've already joined, Sal, a year ago. Is this just a test message?",
          "author": "Eva"
        }
      ]
    }
  }
}

1. Só existe uma mensagem na lista porque ainda não existem outros agentes, mas um dia…​
Thanks for your feedback!
EDIT

Share your suggestions with us!
Click here and then [+ Submit idea]