...
Code Block | ||
---|---|---|
| ||
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.
// os valores são os esperados pelo webservice. Não alterar os valores,
// sob pena de não autenticar o usuário para baixar o token.
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; |
...