SAP Gateway Zero-to-Hero — Pt.4

Internet Communication Framework (ICF)

Erick Carvalho
Bar8
Published in
9 min readOct 25, 2017

--

E aweeeeeeee meu povo!!!!!!

E aqui estamos, na parte quatro! Depois desse monte de textos, ainda não será agora que você irá colocar as mãos na massa e criar seu projeto de serviço no SAP Gateway, mas isso é por um bom motivo. Prometo!

Quando você iniciar suas atividades no gateway perceberá que boa parte da sua rotina, ao menos no começo do desenvolvimento, estará envolvida em transações relacionada a um framework de comunicação com a internet.

Internet Communication Framework — ICF

O ICF permite que você se comunique com o sistema SAP usando protocolos padrões da Internet (como o HTTP, o HTTPS e o SMTP), o que já é muito útil pois lhe tornará capaz de consumir ou criar serviços restful que poderão ser consumidos.

Para entender melhor, o ICF é um componente integrado do Application Server, o que significa que, diferentemente do SAP Gateway, não será necessário instalar nada. Isso torna mais fácil você iniciar suas experiências na criação e consumo de serviços.

O ICF oferece os seguintes benefícios:

  • Flexibilidade: usando o ICF, o usuário pode abrir uma conexão a um sistema SAP pela Internet a partir de qualquer local;
  • Como citado anteriormente, o esforço necessário para configuração é relativamente pequeno — Lembrando que o SAP Gateway também é simples, mas este é ainda mais;
  • Segurança: o protocolo HTTPS garante transferência segura de dados. O nível de segurança é o mesmo que com a comunicação RFC/SNC;
  • E o melhor: você consegue utilizar o seu minisap para isso!

Mãos a obra

A implementação de um nó neste framework é bem simples, e vou descrever como isso funciona logo abaixo:

  1. Vá a transação SICF

2. Então, execute a transação, e você terá a seguinte tela:

Cada um desses nós são muito importantes, pois eles ajudam a compor a URL. Veremos mais o que é uma URL, URI, URN logo logo…

Reparem na imagem abaixo. Dentro do nó public, existe um nó chamado ping. Este serviço é muito interessante quando você quer descobrir se pelo navegador conseguiria acesso ao servidor SAP.

Para facilitar o teste, basta clicar com o botão secundário do mouse em cima do nó que se pretende testar, e então clicar na opção: Testar Serviço. Ao clicar nesta opção, você terá a tela do seu navegador aberta com um endereço maluco, como na tela abaixo. — Observação: Existem ocasiões, que este nó está desativado, vou mostrar mais abaixo que isto é comum, mas caso isto aconteça clique em ativar o serviço e a opção de testar será disponibilizada.
Será inserido automaticamente no navegador a URI (que nada mais é do que o conjunto do protocolo + host e porta + diretório), então nesse caso estaremos acessando um serviço que simula um ping no servidor SAP. Você deverá ter uma mensagem de sucesso como essa da imagem.

3. Vamos agora criar o nosso próprio nó para que então possamos criar o nosso serviço. Para isso, clique com o botão secundário do mouse e então clique na opção: Subelemento novo em cima do nó SAP.

Logo em seguida será apresentada a seguinte tela:

Não esquenta a cabeça com as opções apresentadas, vamos entender mais para frente o que elas significam. Apenas informe um nome para o seu nó, e confirme.

4. Após a confirmação você será levado para a tela abaixo. Serão apresentados vários recursos, mas nesse caso vamos ser bem diretos, pois o que desejamos é ter o nosso serviço de forma prática.

Vamos trabalhar muito com boa parte dos recursos apresentados nessa tela. Aguarde e confie.

5. Clique na aba Lis. Manipuls. (HandlerList).

Essa lista de manipulação é muito interessante: quando você chamar um serviço lá do seu navegador, esse será basicamente o primeiro ponto disponível para que você capture a requisição. Então, neste ponto, vamos fazer um teste bem simples.

6. Vamos na SE24 e criar uma classe. Sim, precisa ser uma classe pois, caso contrário, você obteria o seguinte erro:

Preste atenção, crie uma classe ABAP OO, não me venha com classe procedural… kkkkkk

Uma vez criada a classe na SE24, informe-a para o framework. Simples assim. Apenas crie uma classe (não se preocupe com métodos ou atributos nesse momento), ative-a e então informe seu nome como na imagem abaixo:

Entretanto, ao tentar salvar, você terá esse probleminha acima se fizer exatamente o que sugeri, ou mesmo se colocar algum método de sua escolha. Houston, we have a problem…

É, caros amigos, a SAP realmente pensou em tudo. Se você quiser debugar o framework para entender o que aconteceu vale muito a pena, mas se não quiser eu vos lhe contar o que houve.

Para que essa lista de manipulação possa funcionar, a SAP utiliza o padrão strategy. Para que isso funcione, ela espera que você implemente a interface IF_HTTP_EXTENSION. Vejamos então o que tem demais nesta interface:

Métodos
Atributos

Perceba que é uma interface muito simples, com apenas um comportamento que é bastante sugestivo (HANDLE_REQUEST) que, como o próprio nome já diz, irá manipular qualquer requisição que seja feita ao servidor SAP.

Existem também alguns atributos que serão muito úteis em assuntos mais avançados, como por exemplo para que possamos entender o estado de uma requisição enquanto ocorre seu processamento.

Então, vamos implementar essa interface na nossa classe, que no meu exemplo é a classe Z_CL_BAR8_SERVICE_TEST.

Informe para a classe a interface que será utilizada. #hungarianNotation #ForçaDoHabito
Como em um passe de mágica, instantaneamente um método já aparece para que eu possa implementá-lo. Então, vamos implementá-lo.
Neste momento vamos implementar esse método apenas com um simbólico break-point para que você veja o quão incrível é o que vai acontecer.

Agora, já podemos ativar a nossa classe e então voltar para a SICF para que possamos ativar o nosso serviço.

7. Com classe ativada, não devemos ter mais problemas em preencher a lista de manutenção.

Apenas lembrando: Precisa ser uma classe, e essa classe deve implementar a interface IF_HTTP_EXTENSION.

Feito isso, podemos voltar para a tela anterior e então ativar o serviço para realizarmos nossos testes.

Após ativar, podemos enfim testar.

8. Para testar o seu serviço, volte na implementação do seu break-point e então crie um ponto de parada externo. Se você não tem experiência em debugar chamadas RFC, saiba que inserir apenas uma parada de sessão não irá funcionar. Então, faça como na imagem abaixo:

Lembre-se: ponto de parada externa. É assim que você consegue capturar uma chamada que será executada em uma outra sessão. E sim, mesmo tendo escrito BREAK-POINT explícito, só irá acontecer uma parada para depuração se você inserir um ponto de parada externa.

Agora, clique com o botão secundário do mouse em cima do serviço que foi criado, e então clique em Testar Serviço.

No meu caso, o SAP irá pedir permissão para utilizar o meu navegador e, quando o navegador abrir, será apresentada a seguinte tela:

Perceba que quando você clicar em testar serviço (e autorizar o SAP utilizar o seu navegador), automaticamente será informado (passando na URI) qual o cliente que deverá ser utilizado, que no meu caso é o 700. Então o browser solicita uma simples autenticação via usuário e senha igual ao login do SAP.

Inserindo o usuário e senha (de preferência o mesmo que você utilizou para inserir o ponto de parada externo), o navegador irá realizar a requisição e, então, o seu SAP irá abrir automaticamente a seguinte tela:

Maravilhoso, não?

Pronto, agora você já está apto a realizar requisições diretamente do seu navegador e então cair já dentro do SAP. Mas que tal explorarmos mais um pouco?

E se, ao requisitar um serviço, ele retornasse uma mensagem de sucesso para o navegador? Assim como o serviço de PING havia feito. Voltemos para o método Handle_Request da nossa classe Z_CL_BAR8_SERVICE_TEST.

Lembra que eu havia comentado a respeito de alguns atributos da interface If_HTTP_EXTENSION? Eles começam a ser muito úteis agora, pois nesse momento da requisição eles estão recheados de informação e eu também posso incrementá-los com mais informações. Por exemplo:

Nova implementação do método
Resultado no navegador.

#Tips&Tricks

Nesse trecho iremos ver sobre:

  • Lista de manipulação (HandlerList);
  • Encurtar a URI do seu serviço;
  • Cache;
  • Manipulando o cabeçalho da requisição.

Quando estamos na SICF, perceba que ela funciona com uma estrutura de hierarquia, onde podemos ter situações de nó dentro de nó. Principalmente quando passarmos a criar nossos serviços via SAP Gateway, parte desse processo será automatizado, e será comum termos uma URI tipo:

http://endereço_do_SAP:porta/nó_01/nó_02/../enfim_nó_do_serviço

A representação disso na SICF, ficaria mais ou menos como:

E no navegador a representação disso seria uma URI assim: http://host:porta/sap/opu/odata/sap/zbar8_02

Isso será mais normal (do que você imagina), pois as empresas normalmente terão um espaço próprio na SICF para que você possa criar seus serviços. Com esse tipo de situação, tenho duas dicas para você:

  1. Cada nó desse poderia muito bem ser um serviço. Isso significa que cada nó desse possui sua própria lista de manipulação (HandleList). E ai te pergunto: o que acontece se, por exemplo, existir a referência a uma classe na lista de manipulação do nó OPU e, também, uma referência de uma segunda classe dentro do nó da lista de manipulação zbar8_02? Simples, o SAP irá se basear pela lista de manipulação do nó mais próximo ao topo da hierarquia. Exemplo:
Repare no primeiro campo denominado: caminho (cam.). Estamos nos referenciando ao nó OPU, com a Lista de manipulação fazendo referência a uma classe que será diferente da classe do próximo nó.
Implementação do seu Handle_Request
Esta é uma imagem da configuração do nó zbar8_02 que está sendo implementado por uma segunda classe. Lembrando que é o ultimo nó de sua hierarquia.
Implementação do seu Handle_Request

Agora vamos chamar no navegador o serviço zbar8_02 e vejamos qual será o resultado:

Isso pode parecer simples, mas me tirou do sério em alguns momentos até entender como realmente funcionava.

2. Outra dica. Essa URI gigantesca é horrível, e quando estamos desenvolvendo no dia a dia, isso se torna uma pedra no sapato. Para facilitar, a SAP disponibilizou uma opção para que possamos encurtar URI por meio de alias. E como isso funciona? Simples, veja abaixo:

Após o serviço criado, clique na opção Aliases externos
Será exibido vários aliases previamente criados, e lá em cima na folhinha em branco você terá a opção de criar o seu próprio alias.
1. Insira um nome para o seu alias e então preencha o campo descrição. 2. Clique na aba Elem.Dest. 3. Navegue pela árvore até encontrar o seu serviço. 4. Quando encontrar o seu serviço dê um duplo clique, e então ele será referenciado no campo Elem.Dest. logo abaixo do campo Alias externo.

Basta salvar e seu alias já estará na arvore junto com todos os outros. Então, vá até o navegador e, após o endereço do host:porta, informe o alias. Veja abaixo:

Mais simples, não?

3. Outra dica é uma introdução para o que veremos no futuro, mas também uma ajuda quando você estiver testando o seu serviço. Sempre que estiver testando serviços, teste-os no modo privativo do seu navegador, pois navegadores costumam guardar cachê, e isso é realmente chato. Entretanto utilizando o navegador no modo privativo, toda vez que você chamar um serviço ele irá requerer autenticação com o seu usuário e senha, para facilitar isso é possível deixar um usuário e senha padrão, assim evitando esse aborrecimento. Como configurar:

Agora vá na aba Dados Logon e preencha as informações: Mandante, Usuário, Senha e Idioma. Salve e esteja livre de autenticação a todo momento

4. Esta dica não sei afirmar se faz sentido ou não, entretanto por diversas vezes me ajuda a eliminar cachê do lado do SAP, principalmente quando tenho alguma atualização em classes ligadas a lista de manipulação. Então uma prática que possuo é desativar e ativar logo em seguida o serviço. Se isso faz sentido ou não, eu realmente não consigo afirmar, mas desde então tenho feito e nunca mais tive esse tipo de problema.

5. Esta parte é mais avançada, e vamos entender melhor sobre isso nos próximos posts, mas mesmo assim já quero deixar a referência caso você volte aqui no futuro com muito mais conhecimento para uma segunda leitura. É possível capturar a ação da requisição do seu serviço, e então baseado nela tomar novas decisões. Então caso você não queira utilizar o SAP Gateway é possível controlar todas as requisições por aqui. Veja abaixo:

Com esse código você será capaz de saber tudo o que o navegador enviou no cabeçalho da requisição, como forma de se apresentar para o servidor
Nosso ponto de parada maneiro. E após passar pelo método GET_HEADER_FIELDS dê uma olhada no conteúdo da tabela lt_fields

Você conseguem ver a riqueza que temos aqui? Com essas informações, sabemos qual é o verbo da requisição (~request_method — GET, POST,PUT,DELETE…), tipo de protocolo (~server_protocol) e etc…

Com essas informações somos capazes de fazer algo assim:

Recebo uma requisição, e então posso montar um JSON como resposta
Em um URI podemos inserir parâmetros e para isso utilizamos o ponto de interrogação (?), tudo que vem depois dele será interpretado como query string. Neste caso informei esta quero string, e então fui capaz de captura-la no servidor. Então a utilizei como parâmetro de entrada, recebendo e processando no servidor, e por fim retornando um JSON para o navegador.

Ufaaa…

Então é isso pessoal espero ter conseguido mostrar quão interessante é este framework, e o que ele pode fazer por nós.

--

--

Editor for

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