Consegui fazer a integração com a nova API. Abaixo está a função que utilizo pra obter o token pra autenticar na API.
function GetTokenSNGPC(username, password: string): string;
var
url: string;
Req: IRequest;
Resp: IResponse;
begin
Result := '';
try
url := API_BASE_URL + '/v1/Authentication/GetToken';
Req := CreateRequest(url, False);
Req.AddBody('{"username":"' + username + '", "password": "' +
password + '"}');
Resp := Req.Post;
LogResponse(Resp, 'Obtendo token para autenticação na API do SNGPC');
if Resp.StatusCode = 200 then
Result := Trim(Req.Post.Content).Replace('"', '');
except
on E: Exception do
begin
Logger.Error('Erro ao obter token para autenticar na API do SNGPC.');
end;
end;
end;
O arquivo a ser enviado continua sendo no mesmo formato de antes
Pra autenticar na API seria algo assim (utilizando RestRequest4D)
// Função que utilizo pra criar requisição
function CreateRequest(url: string; authenticated: Boolean): IRequest;
var
Request: IRequest;
begin
Request := TRequest.New;
if authenticated then
Request.TokenBearer(BEARER_TOKEN); // TOKEN obtido chamando a função GetTokenSNGPC passando usuário e senha
Request.BaseURL(url);
Request.ContentType('application/json');
Result := Request;
end;
Pra enviar o arquivo a função que utilizo é a seguinte:
function EnviarXmlSngpc(Arquivo, AToken: string): String;
var
lRequest: IRequest;
lResponse: IResponse;
JSONBody: TJSONObject;
JSONData, EncodedXml, Base64String, Base64XMLFile: String;
Bytes: TBytes;
begin
{ Envia o mesmo arquivo que enviava pra API antiga }
Result := '';
try
{ Cria a requisição }
BEARER_TOKEN := AToken;
lRequest := CreateRequest(API_BASE_URL +
'/v1/FileXml/EnviarArquivoXmlSNGPC', True);
lRequest.Accept('application/json');
{ Monta o JSON conforme a nova API do SNGPC }
{ Lê o arquivo XML }
Bytes := TFile.ReadAllBytes(Arquivo);
{ Codifica em Base64 }
Base64String := TNetEncoding.Base64.EncodeBytesToString(Bytes);
Base64String := StringReplace(Base64String, '#13', '', [rfReplaceAll]);
Base64String := StringReplace(Base64String, '#10', '', [rfReplaceAll]);
Base64String := StringReplace(Base64String, sLineBreak, '', [rfReplaceAll]);
Base64XMLFile := '"' + Base64String + '"';
Logger.Info('JSON enviado à API SNGPC: ' + Base64XMLFile);
lResponse := lRequest.AddBody(Base64XMLFile).Post();
LogResponse(lResponse, 'Enviando XML para o SNGPC');
{ Verifica a resposta }
if lResponse.StatusCode = 200 then
begin
Logger.Info('Arquivo enviado com sucesso!');
Logger.Info('Resposta da API: ' + lResponse.Content);
Result := Trim(lResponse.Content);
end
else
begin
Logger.Error('Falha no envio do arquivo. Status Code: ' +
lResponse.StatusCode.ToString);
Logger.Error('Resposta da API: ' + lResponse.Content);
end;
except
on E: Exception do
begin
Logger.Error('Erro ao enviar o arquivo: ' + E.Message);
Logger.Error(E.StackTrace);
end;
end;
end;