Fazendo requests POST/GET. (PowerBuilder)

Ha algum tempo precisei utilizar o PowerBuilder para realizar requisições GET e POST. Como não foi algo tão trivial quanto deveria e como as informações estavam todas picadas, resolvi fazer este post para ajudar no entendimento.

Antes de começarmos, um aviso: Vou passar os exemplos de códigos aqui, mas criei um repositório com objetos que vão te auxiliar neste processo.

 

Passo 1: Tratando conteúdo das respostas

A primeira coisa que você tem que saber é que precisa criar um objeto seu, herdado de internetresult. Nele você precisa criar o código para a função internetdata. Ela é uma função de callback, que é chamada automaticamente pelo PB, assim que a sua request é concluída. Não existe um padrão para tratar este resultado e o código é bem simples: Basta converter uma variável blob para string.

Vamos chamar este objeto que decodifica o resultado de uo_inet_result. Para cria-lo, primeiro acesse o menu File, New, aba PB Object, Standard Class e selecione a opção internetresult.

Agora abra o painter deste objeto que você acabou de criar e clique na aba “Declare Instance Variables”. Nela, inclua o seguinte código:

Desta forma, você cria uma variável que será acessível por outros objetos, mas que não pode ser modificada externamente. Isso é o suficiente para este exemplo.

 

Agora abra o fonte da função internetdata e insira o seguinte código:

Como disse anteriormente, o procedimento é simples. Basta converter o conteúdo do argumento ‘data‘ de blob para string. Para trabalhar de forma mais segura, coloco o enum EncodingUTF8!. Desta forma, garantimos (ou algo bem próximo a isso) que não vão aparecer caracteres estranhos.

 

Passo 2: Tratando código de retorno

Agora a parte mais difícil está feita. Antes de mostrar como fazer as requests get e post, uma pequena (mas importante) nota: Esta forma de realizar requisições não te da acesso ao status_code da requisição. Você deve tratar os códigos de retorno específicos dos objeto. Veja abaixo:

Código de retorno Tipo da requisição Descrição
1 GET / POST Sucesso!
-1 GET / POST Erro genérico. Aqui pode ser quase qualquer coisa, incluindo falha na criação do objeto herdado de internetresult (que fizemos no passo anterior).
-2 GET / POST URL inválida
-4 GET / POST Não foi possível se conectar a internet
-5 POST Requisição feita utilizando protocolo não suportado. (O PB não da suporte para requisições post, usando https.)
-6 POST Requisição falhou.

 

(Aposto que você não percebeu, mas não existe um código de retorno -3.)

 

Passo 3: Fazendo requisição GET

Abaixo está o exemplo de uma requisição GET simples. Ela utiliza o objeto que criamos no passo 1.

No código acima:

  1. primeiro declaramos e definimos as variáveis.
  2. na sequencia, utilizo o objeto inet (l_inet) para fazer a requisição GET).
  3. depois verifico o código de retorno (li_get_ret), se tudo deu certo (= 1), mostro um MessageBox com o resultado. Se deu errado, mostro outra MessageBox com uma mensagem de erro.

 

Passo 4: Fazendo uma requisição POST

Este tipo de post é bem parecido, com poucas diferenças:

  1. Temos que definir um header para enviar com a requisição;
  2. Precisamos converter o conteúdo que será enviado para blob;

Nó código acima:

  1. Coloquei o conteúdo que desejo enviar via POST na variável ls_data
  2. Criei a variável ls_headers para armazenar a informação de header. Nela coloquei apenas o tamanho dos dados que estão sendo enviados;
  3. Na variável ll_port, configurei a porta que vai ser utilizada.
  4. Por último, converti a variável ls_data de string para blob.

 

Agora que isso foi resolvido, basta fazer a requisição em si:

Acima, apenas utilizei a função PostURL do objeto l_inet e processei o retorno dele, da mesma forma que fiz com a requisição GET.

 

Atenção aos detalhes!

Então, o PowerBuilder possui alguns comportamentos que você deve sempre ter em mente:

  1. Nas requisições GET, para mudar a porta utilizada, você tem que colocar esta informação na URL. (exemplo: http://localhost:5000 ou http://localhost:8080);
  2. Já nas requisições POST, não adianta colocar a porta na URL, você deve utilizar o parâmetro fornecido no método. O PB vai ignorar a porta da URL;
  3. Atenção: Não é possível fazer requisições POST usando HTTPS. GET é tranquilo;
  4. Requisições post não podem ter querystring.

 

Exemplos no Github

Criei uma aplicação de demonstração. Nela inclui uma PBL com os objetos já prontos para serem utilizados (uo_requester e uo_inet_result).

Para utiliza-los, veja os exemplos:

 

Request GET com Querystring #1

 

Request GET com Querystring #2

 

Request POST

 

 

Como encapsular estes métodos

Para facilitar, criei um objeto chamado uo_dummy_requester, que encapsula as chamadas para uma api de teste que criei. Você pode utiliza-la como exemplo para encapsular as chamadas que você precisa utilizar.

 

Link para o fonte no GitHubhttps://github.com/brenordv/powerbuilder_webservice_poc

 

 

Espero ter ajudado!

 

Referências:

  1. inet.GetURL
  2. inet.PostURL
The following two tabs change content below.
Breno RdV
Ex-Psicólogo, com quase uma década de experiência em Recursos Humanos e Gestão de Pessoas, atual desenvolvedor e Analista de Sistemas, trabalhando com PowerBuilder, C#, PowerShell e expandindo horizontes para Python, Xamarin, PHP, Angular e (por que não?) Unity.
Breno RdV

Latest posts by Breno RdV (see all)

Comments

comments

Posted in Dev, PowerBuilder and tagged , , , , , .