Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

API demo para desenvolvimento do exemplo

Neste exemplo, será mostrado o envio de dados no formato JSON para serem consumidos por uma API criada especificamente para este propósito.

...

O arquivo executável será postado abaixo:

View file
nameDemoJwt.exe

Desenvolvendo o Script

O Script foi feito para ser utilizado em qualquer evento, de qualquer tabela, com o VsScripter, podendo ser executado ali mesmo diretamente do editor de scripts para efeitos didáticos.

Abaixo, segue o código a ser copiado/digitado no editor VsScripter:

Code Block
languagepas
uses
   // units necessárias para o projeto. Todas são de inclusão manual
   uVsHttpRequest, uLkJson, Classes;
   
const
   // constantes necessárias para o Login que baixará o token de autenticação

...


   User 

...

= 'admin';   
   Password = 'admin'; 
   

...

var

...

 

...

 

...

 

...

// 

...

variáveis 

...

globais 

...

necessárias para 

...

efetivar os "requests http", de armazenamento
   // do token, de criação de um objeto JSON e do armazenamento do resultado (Response)
   // sequencialmente
   http  : TVsHttp;            
   cUrl  : String;          

...

 

...

 

...

    

...

 

...

 

...

    

...

 

...

    

...

 

...

  

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

    

...

 

...

 

...

          

...

 

...


...

 

...

 

...

 

...

token 

...

: 

...

String;

...

 

...

 

...

 

...

jsonO 

...

: TlkJSONobject;
   resultado: THttpResponse;
   dados: TStringList;
         

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

      

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

                     

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

              
// criando uma função para tratar 

...

os 

...

erros mais comuns nos "requests http"
function RetornaErro(erro: Integer):String;
begin
   

...

case erro of    
     400: Result := IntToStr(erro)+' - 

...

Requisição 

...

ruim: 

...

A 

...

requisição 

...

não 

...

pôde 

...

ser '+
                    '

...

interpretada 

...

pelo 

...

servidor 

...

em razão de erros de formato/sintaxe.';
     401: Result := IntToStr(erro)+' - Não autorizado:'#13#13'A requisição requer '+
              

...

 

...

 

...

 

...

 

...

 

...

 

...

'

...

autenticação por parte do cliente e 

...

as 

...

informações 

...

de '+
                    'autenticação não foram localizadas ou não são 

...

válidas.

...

'

...

; 

...

 

...

 

...

 

...

 

...


...

 

...

    403: Result := IntToStr(erro)+' - Indica que o servidor entendeu o pedido, '+
    

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

        'mas se recusa a autorizá-lo. Esse status é semelhante ao 401, '+
 

...

  

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

      

...

 

...

 

...

 

...

'mas 

...

neste 

...

caso, 

...

a re-autenticação não fará diferença.';
     404: Result := IntToStr(erro)+' - A página não foi encontrada ou não existe '+
 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

          'mais. '#13#13'Entre as 

...

principais 

...

causas 

...

para aparecer o '+
                    '

...

problema 

...

estão: 

...

páginas 

...

removidas 

...

do 

...

site, 

...

modificação na '+
                    '

...

URL 

...

sem 

...

um 

...

redirecionamento e erros de digitação no navegador.';
     405: Result := IntToStr(erro)+' - 

...

Método 

...

não permitido:'#13#13'O método HTTP '+
                    '

...

utilizado 

...

não 

...

é 

...

permitido 

...

para 

...

o 

...

recurso 

...

identificado 

...

na URL.';       
     422: Result 

...

:= IntToStr(erro)+' - Entidade não processável:'#13#13'O servidor '+
                    'reconhece que as informações estão na sintaxe correta, mas '

...

+
     

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

    

...

    'seu conteúdo 

...

está 

...

semanticamente incorreto.';
     500: Result := IntToStr(erro)+' - Indica problemas com a estrutura do site '+
        

...

 

...

 

...

 

...

 

...

    

...

 

...

  

...

 

...

'que o 

...

usuário 

...

deseja 

...

acessar, 

...

então 

...

não 

...

se 

...

trata 

...

de 

...

um 

...

bug '+
                    'com o computador ou navegador, nem mesmo com a Internet do '+
                    'usuário.';
     11001: Result := IntToStr(erro)+'Sem conexão com a Internet'
   else
     // caso o número do erro não esteja listado acima, será mostrado seu número
     

...

// sem a 

...

devida descrição.
   

...

 

...

 

...

Result 

...

:= 

...

'Erro retornado: '+IntToStr(erro);
   end;
end;

// Procedure para buscar o token de autenticação necessário para consumo da API
Procedure PegaToken;          

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

     

...

 

...

 

...

     

...

 

...

 

...

       

...

 

...

 

...

 

...

 

...

 

...

 

...

     

...

 

...

 

...

                         

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 
begin
  // 

...

cria 

...

um 

...

objeto 

...

chamado 

...

http, do tipo TVsHttp, responsável pelos "requests"
  // http da API consumida
  http := TVsHttp.Create;
  try
    // 

...

informa ao 

...

método 

...

"POST" 

...

da 

...

requisição 

...

http 

...

que 

...

o 

...

conteúdo 

...

enviado 

...

é 

...

do
    // 

...

tipo 

...

JSON

...

 

...

 

...

 

...

 http.ContentType := 'application/json'; 

    // 

...

URL 

...

da 

...

API 

...

a 

...

ser 

...

consumida

...

 

...

 

...

 

...

 

...

cUrl 

...

:= 'http://127.0.0.1:2001/tms/auth/LoginService/Login';               

...

 

...

 

...

 

...

 

...


...

 

...

 

...

 

...

 

...

// 

...

envio 

...

da 

...

requisição 

...

http, 

...

por meio do método 

...

"POST", para solicitar o
    // novo token de autenticação. As API's possuem tempos de validade do token
    // diferenciados. Cada provedor de serviços web saberá dizer de quanto em 
    // quanto tempo o token deve ser renovado. Neste exemplo, ele sempre será
    // renovado 

...

no momento de sua execução, por meio desta "Procedure".
    
    // resultado é um objeto do tipo THttpResponse, que receberá toda a resposta
    // oriunda da requisição enviada por meio 

...

do 

...

objeto 

...

http.

...

 

...

 

...

 

...

 

...


    // 

...

cUrl 

...

é 

...

a 

...

URL 

...

da 

...

API 

...

definida 

...

acima. User e 

...

Password 

...

são 

...

os 

...

parâmetros
    // 

...

necessários 

...

ao Login dessa "Procedure" na API para baixar o token.

...

 

...

 

...

 

...

 

...

resultado 

...

:= http.Post(cUrl, Format('{"User":"%s","Password":"%s"}',
            

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

     

...

 

...

 

...

 

...

 

...

     

...

[User, Password]));

    // verificando se o resultado recebido é um erro ou se deu certo o envio dos
    // dados por meio da propriedade 

...

resultado.StatusCode. Se o valor de StatusCode
    

...

// for igual ou maior que 400, indica que houve um erro e ele será tratado pela
    // 

...

função RetornaErro.
    
    // 

...

caso 

...

o valor de StatusCode seja 200, isso indica que houve sucesso na requi-
    // sição http e o resultado será transformado em um objeto JSON para, aí, ser
    // atribuído a variável token.
    if resultado.StatusCode >= 400 then                                
       ShowMessage('Pega token: '+RetornaErro(resultado.StatusCode))
    else if resultado.Statuscode = 200 then
    begin     
        jsonO := TlkJSON.ParseText(resultado.Response) as TlkJSONObject;
        token := jsonO.Field['value'].value;
    end;                                 

...

     

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

     

...

                                             

...

             
     

...

 

...

  

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

    

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

    

...

 

...

 

...

    

...

       

...

 

...

 

...

 

...

 

...

 

...


...

 

...

 

...

finally

...

 

...

 

...

 

...

 

...

// finaliza os dois objetos para liberar 

...

memória.

...

 

...

   http.Free;                   

...

        

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 
    jsonO.Free; 

...

 

...

 

...

 

...

 

...

 

...

        

...

 

...

 

...


...

 

...

 

...

end;

...

end;

// criando a função EnviaDados
Function EnviaDados(cDados: TStringList; geraToken: Boolean):THttpResponse;
var
   // 

...

declarando 

...

o objeto 

...

obj para preparação do 

...

cabeçalho 

...

http

...

 

...

 

...

 obj: TCustomHeader;
begin
   

...

try

...

 

...

 

...

 

...

   // se foi passado 

...

true 

...

para o parâmetro geraToken, será gerado um novo token
      if geraToken then         

...

 

...

 

...

       

...

        

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

       

...

 

...

 

...

             

...

 

...

 

...

               

...

 

...

 

...

 

...

 

...

 

...

 

...

    

...

PegaToken;

      // 

...

cria 

...

parâmetro 

...

do 

...

Head 

...

http 

...

chamado 

...

Authorization 

...

e 

...

envia 

...

o 

...

token 

...

para
      // 

...

autenticação 

...

para 

...

consumo 

...

da 

...

API 

...


...

 

...

 

...

 

...

 

...

 

...

 obj := TCustomHeader.Create('Authorization', 'Bearer ' + token);

...

 

...

 

...

 

...

   

...

       // 

...

cria 

...

um objeto chamado http, do tipo TVsHttp, responsável pelos 

...

"requests"
    

...

   // http da API consumida
       http := TVsHttp.Create;
      

      // informa ao método "POST" da requisição http que o conteúdo 

...

enviado 

...

é do

...

  

...

    // 

...

tipo 

...

JSON 

...

 

...

 

...

 

...

 

...

 
  

...

    http.ContentType := 

...

'application/json';      
      // adiciona autenticação criada no objeto obj ao cabeçalho customizado no
      // objeto http
    

...

 

...

 

...

http.CustomHeaders.

...

Add(obj);

      // URL da API a ser 

...

consumida

...

 

...

 

...

 

...

   cUrl := 'http://127.0.0.1:2001/tms/xdata/apiservice/enviarpedido';

      // Result retorna o resultado vindo da API consumida. Se os dados foram
      // recebidos e processados, ou se houve erro e qual é o erro. 
      Result := http.Post(cUrl, cDados.Text);
   finally
  

...

    // destrói 

...

o objeto http
      

...

http.free;
   end; 
end;        

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

 

...

       

...

 

...

 

...

 

...

       

// execução do Script
begin

...

 

...

 

...

 

...

// 

...

cria 

...

objeto 

...

dados 

...

do 

...

tipo 

...

TStringList, 

...

que 

...

receberá 

...

os 

...

dados 

...

a 

...

serem 

...

en-
   // 

...

viados para a API, como "Body" da 

...

requisição 

...

http.

...


...

 

...

 

...

 

...

dados 

...

:= TStringList.Create();

   

...

// 

...

início do ciclo de vida do script
   try
     
      // adiciona 

...

dados a TStringList dados, que serão enviados à função EnviaDados
      dados.Add('{');
      dados.Add('"PedidoId":1,');
      dados.Add('"ClienteID":"000456",');
      dados.Add('"ClienteNome":"000456",');
      dados.Add('"ProdutoID":"164756392300",');
      dados.Add('"ProdutoQTD":100,');
      dados.Add('"ProdutoValorUnt":12.5');
      dados.Add('}');
      
      // 

...

recebe o 

...

resultado 

...

vindo 

...

função 

...

EnviaDados, 

...

por 

...

meio 

...

de 

...

'http 

...

response'

...

 

...

     resultado 

...

:= EnviaDados(dados, true);
      
      // 

...

verificando 

...

se o 

...

resultado recebido 

...

é 

...

um 

...

erro 

...

ou 

...

se 

...

deu 

...

certo o envio dos
      // 

...

dados 

...

por 

...

meio da propriedade resultado.StatusCode. Se o valor de StatusCode
    

...

 

...

 // for igual ou maior que 400, indica que houve um erro e ele será tratado pela
      

...

// 

...

função 

...

RetornaErro.

...


 

...

 

...

 

...

 
      

...

// caso o valor de StatusCode seja 200, isso indica que houve sucesso na requi-
      // sição http e o resultado retornado 

...

será mostrato por meio do ShowMessage
      // 

...

que é exatamente o retorno da API que está programada para retornar o
   

...

   // 

...

mesmo 

...

JSON enviado.
    
      if resultado.StatusCode >= 400 then
        ShowMessage('Envio de dados: ' + RetornaErro(resultado.StatusCode))
      else if resultado.Statuscode = 200 then
        ShowMessage('HTTP 200 OK'#13#13+ 'Esses foram os dados enviados:'#13#13
                    +resultado.Response);
   finally
      // destrói a TStringList dados para liberar memória.
      dados.free;
   end;
end;