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 de 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
    // direfenciados. 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 a fim de 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 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;