Consumo de API, enviando dados por meio do método "HTTP POST", dentro de um Projeto Personalizado do VsScripter

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 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:

Desenvolvendo o Script

Abra o Gerenciador de Projetos no menu Configurações → Projetos Personalizados → Gerenciador de Projetos. Em seguida, clique no botão Novo Projeto e preencha o formulário que solicita o nome do projeto com “EnviaDadosJSON”, igual é mostrado na figura abaixo:

O editor do VsScripter será aberto:

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

Testando o script de Envio de Dados JSON

Para testar o “script”, é necessário executá-lo por meio do botão Executar, a partir do Gerenciador de Projetos:

Após efetuar a troca do usuário, o projeto “Envio de Dados JSON para consumo de API“ aparecerá no menu Projetos Personalizados, conforme imagem abaixo:

Para este script, a execução não requer qualquer informação do usuário, pois os dados a serem enviados ao webservice já estão no script. Assim, o webservice receberá esses dados e responderá com o mesmo conteúdo recebido: