Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

Version 1 Next »

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

O serviço criado para consumo da API deve ser executado pelo usuário antes de iniciar os testes. O mesmo deverá ser executado no “prompt” de comandos em modo administrativo. Este serviço ficará em execução enquanto os testes forem executados, utilizando-se da porta 2001. As “URLs” que serão consumidas estão disponíveis no código abaixo.

O arquivo executável será postado abaixo:

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

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

uses
   // units necessárias para o projeto. Todas são de inclusão manual
   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
  try
    // 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'; 

    // 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;

      // adiciona autenticação criada no objeto obj ao cabeçalho customizado no
      // objeto http
      http.CustomHeaders.Add(obj);

      // 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/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
   // início do ciclo de vida do script
   try
      // 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();
      
      // 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;                                                                                                              

  • No labels