SAP Gateway Zero-to-Hero — Pt. 6.3

SAP Gateway — Criando seu primeiro serviço baseado em RFC ou BOR

Erick Carvalho
Bar8
Published in
7 min readDec 1, 2017

--

E aweeeee meu povo!!!!

Depois de aprendermos como criar serviços na unha, e baseados na DDIC. É hora de entendemos como funciona a criação do modelo do serviço baseado em Remote Function Call (RFC) ou Business Object Repository (BOR).

Essa capacidade de criarmos nossos serviços baseado em uma função ou BAPI é realmente muito interessante, e muito útil.

Criando o serviço

Clique no botão para criar um novo serviço:

Clique em Import > RFC/BOR Interface:

Será apresentado a seguinte tela de popup, onde:

Essa tela já não é tão estranha, temos que informar como nas outras o nome da entidade, e se desejamos que seja criado o Entity Set (coleção) para a nossa entidade.

As novidades estão em:

  • Target System — Onde podemos informar se o objeto em questão seja ele RFC ou BOR está localmente ou em outro ambiente, e então podemos informar um endereço de destino;
  • Data Source Attributes — No campo Type será nos apresentado as duas opções RFC ou BOR, logo abaixo você indica qual o nome da RFC ou BOR.

Para que possamos seguir com esse exemplo, irei criar uma função antes com um simples parâmetro de entrada e um outro parâmetro de saída:

Não se apegue no que faz essa função agora, ela servirá apenas como um modo de alcançarmos a criação do nosso serviço. Não interessa ainda o resultado que ela irá nos trazer
Uma configuração importantíssima é que a função esteja com a opção Remote-Enabled Module (RFC) esteja setada, caso contrário essa função não estará disponível no próximo passo.

Então agora irei informar essa função na tela de seleção, e então teremos algo assim:

Caso não tivéssemos setado a função como RFC, neste passo não conseguiríamos seleciona-la.

Então você será direcionado a uma tela que requer a definição de quais campos serão necessário para utilização do nosso serviço. Mas mais do que isso reparem nos ícones que são utilizados para representar cada estrutura. Esses ícones são referentes:

  • Import Parameter;
  • Export Parameter;
  • Changing Parameter;
  • Tables Parameter;
  • BAPI Return Parameter;
  • Selection Option Parameter.

Atenção com a opção BAPI Return Parameter, este é um retorno baseado no tipo BAPIRET2. Sem dúvida é uma das opções mais úteis ao desenvolver um serviço utilizando o SAP Gateway, isso porque existe uma tratativa que sempre que você disparar uma excessão informando um erro, o gateway entende, e então já preenche essa estrutura, retornando para o cliente uma mensagem amigável informando sobre o problema que ocorreu com o código HTTP mais adequado. #NoDumps #NoInternalServerError #No500.

Na tela seguinte como nos exemplos anteriores, precisamos escolher uma chave para o nosso serviço.

Finish :)

Após finalizado você deve receber uma bela mensagem como abaixo:

Exibição das propriedades já importadas baseadas nos parâmetros de importação e exportação

Neste post vamos avançar um pouco mais, e vamos fazer o nosso serviço retornar algo um pouco mais interessante que um metadata. Como fizemos antes, gerar o serviço clicando na opção de gerar o serviço:

Não sei como descrever isso, então vai ícone do botão de gerar serviço
Boa e velha tela informando as classes que serão geradas e os serviços que serão registrados
Serviço gerado

Depois de verificarmos que o nosso modelo está okay, vamos utilizar a nossa função para com um propósito a mais do que simplesmente tê-la como base para o nosso modelo, usando-a como rotina da nossa implementação.

Implementando o serviço

Agora no service implementation, clique com o botão secundário em GetEntity (Read), e então selecione Map to Data Source:

Lembrando que a opção GetEntity (Read) é a representação do verbo HTTP GET

Será aberto um popup onde você deverá selecionar o destino, se é RFC ou BOR e seu respectivo nome:

Então você voltará para o service builder, mas desta vez com a opção de apenas mapear a função com a interface do seu serviço (modelo)

Utilizando o recurso de arrastar e soltar, é possível arrastar os nós da árvore que simboliza os parâmetros da função para os respectivos campos da interface do serviço.

O interessante de utilizar a opção de arrastar e soltar, é que o próprio service builder já irá sugerir a direção do mapeamento. Neste caso parâmetros de importação são parâmetros de entrada e export parâmetros de saída.

Feito isso, é necessário regerar o serviço para que as classes MPC e DPC sejam rescritas pelo service builder. Abaixo um exemplo de como é o método que não está implementado, e após o mapeamento e regerar o serviço visto do ABAP Workbench:

FLIGHTSET_GET_ENTITY sem implementação, apenas uma excessão implementada com uma mensagem amigável
O mesmo FLIGHTSET_GET_ENTITY após regerar o serviço agora possui uma série de rotinas. Mas preste atenção no que destaquei, o que irá acontecer ali será simplesmente chamar a função mapeada previamente.

Registrando o serviço

Registre o serviço na ICF:

Serviço Registrado. Fim

Testando o serviço via postman:

Serviço no ar!

Executando o serviço

No nosso bom e velho postman, vamos executar a implementação do nosso serviço.

Apenas relembrando a nossa função ela possuía um parâmetro de entrada e outro de saída. Um outro ponto é que implementamos um método GET. Sabendo disso o que precisamos fazer é configurar o postman para uma requisição GET e na URI informar um parâmetro de entrada.

Então temos o seguinte:

A grande novidade na imagem acima, é que depois do nome do serviço passamos a informar o nome do modelo e qual o seu respectivo input. Então o serviço já nos retornou a saída que neste caso é o valor MostExpensive.

É possível debugar isso?

Sim, para que isso seja possível você precisará inserir um ponto de parada externo no método que seja debugar, neste caso trata-se do FLIGHTSET_GET_ENTITY. Vejamos como isso funciona:

Clique com o botão secundário no método implementado, e então selecione Go to ABAP Workbench
Selecione o método implementado, nesse caso sabemos que é o FLIGHTSET_GET_ENTITY
Insira um ponto de parada externo, e atente-se em garantir que o usuário e senha informado no postman (ou navegador) que você está utilizando para se autenticar no SAP é o mesmo que você está usando como sessão no SAP.
Vá ao postman e execute o serviço. Você perceberá que ele não terá um retorno como anteriormente, ele ficará travado na tela acima, e então uma sessão do seu SAP será aberta com o ponto de parada para que você possa debugar
Sessão aberta, e então é possível debugar o serviço e verificar como essa belezinha funciona. Basta um F8 e o SAP deve retornar a requisição para o cliente.

Um último pontinho…

Voltemos a nossa função e então implementemos um retorno para log de possíveis erros. Para isso faça como na imagem abaixo:

Insira um parâmetro de exportação do tipo BAPIRET2 para que no momento que for lançado uma exceção o framework do gateway possa preencher informando a causa do problema.

Voltando para a SEGW você perceberá que dando um duplo no MAPPING da implementação do nosso serviço, a nossa tabela de erros já estará referenciada, e note que o ícone dela é apresentado, isso pois apenas por ter declarado uma tabela com o tipo BAPIRET2 o SAP Gateway já entende que trata-se de uma tabela de retorno de logs.

Recomendo bastante a utilização do tipo BAPIRET2, entretanto não somos obrigado a utilizá-la. Caso deseje utilizar a sua própria estrutura de logs, é possível assim fazer e então clicando no botão SET/UNSET LOG o gateway transforma esse retorno em uma referência para retornos relacionado a Logs.

Conclusão

Então pessoal já deu pra perceber que existe bastante coisa para ser aprendido e não foi ainda que realmente implementamos um serviço digno para ser levado à produção.

Então estarei sempre inserindo um novo elemento a cada post. Hoje vimos um pouco mais sobre como funciona a modelagem e implementação de um serviço baseado em uma função, e de forma bem rápida já passamos o nosso primeiro parâmetro via URI, mas iremos aprofundar muito mais que isso. #AguardeConfie.

--

--

Editor for

Agilista, Desenvolvedor e quando não está discutindo TDD está sendo repreendido por algum comentário infeliz