Ir para conteúdo
  • Cadastre-se

dev botao
  • Este tópico foi criado há 1898 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Boa Tarde Pessoal!

Se puderem me orientar, preciso consumir uma API (segue documentação... https://api.tudoentregue.com.br/Documentacao/index.html)

Quanto à geração dos arquivo no formato Json, eu já consegui entender.

Porém, já tentei de várias formas e não consigo fechar comunicação com web service para Post do arquivo.

Vi na documentação que tem um "AppKey" e um "RequesterKey". As duas chaves eu possuo mas não tenho ideia de onde as defino.

securityDefinitions": {
    "AppKey": {
      "type": "apiKey",
      "in": "header",
      "name": "AppKey",
      "description": "Identificador do software Homologado junto à ActiveCorp para integrar dados ao TudoEntregue."
    },
    "RequesterKey": {
      "type": "apiKey",
      "in": "header",
      "name": "RequesterKey",
      "description": "Identificador único do Motorista/Cliente junto ao TudoEntregue."

 

Estou utilizando IDHTTP, mas seria interessante que o envio fosse através de HTTPS.

Vejam como estou fazendo:

 

var code : Integer;
    sResponse : String;
    Json : String;
    JsontoSend : TStringStream;
begin
  Json := '{"PhoneCountry": "+55",  "PhoneNumber": "19999999999",  "Name": "Daniel",  "IMEI": "",  "DeviceKey": "", "DeviceId": "",';
  Json := Json +'"DeviceType": "MarcaModelo",  "OSName": "Android",  "OSVersion": "7.0",  "Email": "[email protected]",  "ZipCode": "13400000",  "City": "Piracicaba",  "State": "Sao Paulo",  "Enable": false}';

  JsonToSend := TStringStream.Create(utf8Encode(Json));
  try
   IdHTTP1.Request.Clear;
   IdHTTP1.Request.CharSet := 'UTF-8';
   IdHTTP1.Request.Method := 'POST';
   IdHTTP1.Request.ContentType := 'application/json';

   IdHTTP1.Response.ContentType := 'applicattion/json';
   IdHTTP1.Response.CharSet := 'UTF-8';
   try
     sResponse := IdHTTP1.Post('http://api.tudoentregue.com.br/v1/drivers',JsontoSend);
   except
     on E:EIdHTTPProtocolException do
     begin
       Memo1.Lines.Clear;
       Memo1.Lines.Add('Error on Request: ' + #13+#10 + e.Message);
       exit;
     end;
   end;
   Memo1.Lines.Clear;
   Memo1.Lines.Add(sResponse);

   finally
      JsontoSend.Free();
  end;
end;
 

 

Alguém poderia me dar um exemplo de como enviar os arquivos se possivel em HTTPS?

Desde já agradeço!

 

Daniel

Postado
40 minutos atrás, d2mpavan disse:

Boa Tarde Pessoal!

Se puderem me orientar, preciso consumir uma API (segue documentação... https://api.tudoentregue.com.br/Documentacao/index.html)

Quanto à geração dos arquivo no formato Json, eu já consegui entender.

Porém, já tentei de várias formas e não consigo fechar comunicação com web service para Post do arquivo.

Vi na documentação que tem um "AppKey" e um "RequesterKey". As duas chaves eu possuo mas não tenho ideia de onde as defino.


securityDefinitions": {
    "AppKey": {
      "type": "apiKey",
      "in": "header",
      "name": "AppKey",
      "description": "Identificador do software Homologado junto à ActiveCorp para integrar dados ao TudoEntregue."
    },
    "RequesterKey": {
      "type": "apiKey",
      "in": "header",
      "name": "RequesterKey",
      "description": "Identificador único do Motorista/Cliente junto ao TudoEntregue."

 

Estou utilizando IDHTTP, mas seria interessante que o envio fosse através de HTTPS.

Vejam como estou fazendo:

 

var code : Integer;
    sResponse : String;
    Json : String;
    JsontoSend : TStringStream;
begin
  Json := '{"PhoneCountry": "+55",  "PhoneNumber": "19999999999",  "Name": "Daniel",  "IMEI": "",  "DeviceKey": "", "DeviceId": "",';
  Json := Json +'"DeviceType": "MarcaModelo",  "OSName": "Android",  "OSVersion": "7.0",  "Email": "[email protected]",  "ZipCode": "13400000",  "City": "Piracicaba",  "State": "Sao Paulo",  "Enable": false}';

  JsonToSend := TStringStream.Create(utf8Encode(Json));
  try
   IdHTTP1.Request.Clear;
   IdHTTP1.Request.CharSet := 'UTF-8';
   IdHTTP1.Request.Method := 'POST';
   IdHTTP1.Request.ContentType := 'application/json';

   IdHTTP1.Response.ContentType := 'applicattion/json';
   IdHTTP1.Response.CharSet := 'UTF-8';
   try
     sResponse := IdHTTP1.Post('http://api.tudoentregue.com.br/v1/drivers',JsontoSend);
   except
     on E:EIdHTTPProtocolException do
     begin
       Memo1.Lines.Clear;
       Memo1.Lines.Add('Error on Request: ' + #13+#10 + e.Message);
       exit;
     end;
   end;
   Memo1.Lines.Clear;
   Memo1.Lines.Add(sResponse);

   finally
      JsontoSend.Free();
  end;
end;
 

 

Alguém poderia me dar um exemplo de como enviar os arquivos se possivel em HTTPS?

Desde já agradeço!

 

Daniel

tente assim:

   IdHTTP1.Request.Clear;
   IdHTTP1.Request.CharSet := 'UTF-8';
   IdHTTP1.Request.Method := 'POST';
   IdHTTP1.Request.ContentType := 'application/json';
   IdHTTP1.Request.CustomHeaders.AddValue('AppKey','seuAppKey');
   IdHTTP1.Request.CustomHeaders.AddValue('RequesterKey','seuRequesterKey');

ou assim:

Var
 lJsonStream: TStringStream;
 lIdHTTP: THTTPClient;
 sUrlFull: String;
 AResponseContent: TStringStream;
 istatusCode:Integer;
 sResposta:String;
Begin
 lJsonStream := TStringStream.Create(aJSON);
 AResponseContent := TStringStream.Create('');
 lIdHTTP := THTTPClient.Create;
 Try
  lIdHTTP.CustomHeaders['AppKey'] := 'seuAppKey';
  lIdHTTP.CustomHeaders['RequesterKey'] := 'seuRequesterKey';
  lIdHTTP.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; Win632; x86; rv:47.0) Gecko/20100101 Firefox/47.0';
  lIdHTTP.ContentType := 'application/json';
  istatusCode := lIdHTTP.Post('https://api.tudoentregue.com.br/v1/drivers', lJsonStream, AResponseContent).StatusCode;
  sResposta := AResponseContent.DataString;
 Finally
  Begin
   FreeAndNil(lJsonStream);
   FreeAndNil(AResponseContent);
   FreeAndNil(lIdHTTP);
  End;
 End;

mas fica difícil testar sem as keys.

Postado

Bom dia Datilas!

Muito obrigado por me ajudar!

Porém, quando inseri as keys e tentei transmitir um arquivo obtive uma resposta vazia e os dados não foram inseridos. Isso quando apenas inseri as chaves utilizando o componente idhttp que eu estava utilizando.

Testei também conforme seu código só que apresentou erro "undeclared identifier: 'THTTPClient'

Como devo declarar na uses para corrigir o problema? (uso Delphi Rad Studio XE).

 

Desde já agradeço se puder me ajudar novamente.

Grande abraço!

 

Daniel

Postado
6 minutos atrás, d2mpavan disse:

Bom dia Datilas!

Muito obrigado por me ajudar!

Porém, quando inseri as keys e tentei transmitir um arquivo obtive uma resposta vazia e os dados não foram inseridos. Isso quando apenas inseri as chaves utilizando o componente idhttp que eu estava utilizando.

Testei também conforme seu código só que apresentou erro "undeclared identifier: 'THTTPClient'

Como devo declarar na uses para corrigir o problema? (uso Delphi Rad Studio XE).

 

Desde já agradeço se puder me ajudar novamente.

Grande abraço!

 

Daniel

uses

 System.Net.HttpClient,
 System.Net.URLClient,
 System.NetConsts;

Postado

voce pode testar dentro da propria api

acessa: https://api.tudoentregue.com.br/Documentacao/index.html

clique no botão Authorize do lado direito

digite suas keys clique no botão Authorize dentro da tela que abriu

feche essa tela.

logo abaixo clique na primeira opção

clique no botão "try it out"

logo em baixo clique no botão execute

vc vai ter uma resposta parecida com essa:

curl -X POST "http://api.tudoentregue.com.br/v1/drivers" -H  "accept: application/json" -H  "AppKey: gfg" -H  "RequesterKey: gdf" -H  "content-type: application/json" -d "{  \"PhoneCountry\": \"+55\",  \"PhoneNumber\": \"99999999999\",  \"Name\": \"Motorista Exemplo\",  \"IMEI\": \"999999999999999\",  \"DeviceKey\": \"XXX99xXX-...\",  \"DeviceId\": \"9FF9F9FFF99FFFFF9999F9FFF99999F9\",  \"DeviceType\": \"MarcaModelo\",  \"OSName\": \"Android\",  \"OSVersion\": \"7.0\",  \"Email\": \"[email protected]\",  \"ZipCode\": \"99999999\",  \"City\": \"Cidade do Exemplo.\",  \"State\": \"Estado do Exemplo.\",  \"Enable\": false}"
2 minutos atrás, d2mpavan disse:

Então...

Inseri as informações na uses, porém quando vou compilar, não encontra o arquivo, por exemplo: "file not found: NetConsts.dcu"

Obrigado!

então remova essa uses

Postado

Certo,

Mas como faço para usar como você fez no seu exemplo inicial com o THTTPClient? (apresenta undeclared identifier)

Ou com o TIDHTTP que estou usando terei o mesmo efeito?

É que não estou tendo retorno usando o TIDHTTP...

 

Obrigado!

Postado
11 minutos atrás, d2mpavan disse:

Certo,

Mas como faço para usar como você fez no seu exemplo inicial com o THTTPClient? (apresenta undeclared identifier)

Ou com o TIDHTTP que estou usando terei o mesmo efeito?

É que não estou tendo retorno usando o TIDHTTP...

 

Obrigado!

pra mim aparece: HTTP/1.1 422 Unprocessable Entity

seu try except não esta deixando voce ver o erro

Postado

Pra mim, na primeira vez que rodo retorna vazio.

Na segunda vez em diante retorna o mesmo erro que aparece pra você.

Por favor, dê uma olhada se pode me ajudar. O código abaixo está com o App e Requester Key...

Não sei como fechar essa comunicação... lembrando que estou usando o componente IDHTTP.

segue código...

var code : Integer;
    sResponse : String;
    Json : String;
    JsontoSend, AResponseContent : TStringStream;
    iStatusCode : Integer;
begin
  Json := '{"PhoneCountry": "+55",  "PhoneNumber": "19999999999",  "Name": "Daniel",  "IMEI": "123",  "DeviceKey": "123456", "DeviceId": "222555",';
  Json := Json +'"DeviceType": "MarcaModelo",  "OSName": "Android",  "OSVersion": "7.0",  "Email": "[email protected]",  "ZipCode": "13425066",  "City": "Piracicaba",  "State": "Sao Paulo",  "Enable": false}';

  JsonToSend := TStringStream.Create(Json);
  AResponseContent := TStringStream.Create('');
  try
   IdHTTP1.Request.Clear;
   IdHTTP1.Request.CharSet := 'UTF-8';
   IdHTTP1.Request.Method := 'POST';
   IdHTTP1.Request.Username := '';
   IdHTTP1.Request.Password := '';
   IdHTTP1.Request.ContentType := 'application/json';
   IdHTTP1.Request.CustomHeaders.AddValue('AppKey','58fb05c3-4e8b-4929-b7df-95bd261035c9');
   IdHTTP1.Request.CustomHeaders.AddValue('RequesterKey','629eda6f-9df5-40e7-a94e-4c54cec83a15');

   IdHTTP1.Response.ContentType := 'applicattion/json';
   IdHTTP1.Response.CharSet := 'UTF-8';
   try
     sresponse := IdHTTP1.Post('https://api.tudoentregue.com.br/v1/drivers',JsontoSend);
   except
     on E:EIdHTTPProtocolException do
     begin
       Memo1.Lines.Clear;
       Memo1.Lines.Add('Error on Request: ' + #13+#10 + e.Message);
       exit;
     end;
   end;
   Memo1.Lines.Clear;
   Memo1.Lines.Add(sResponse);

   finally
      JsontoSend.Free();
  end;
end;
 

Postado
1 hora atrás, d2mpavan disse:

Pra mim, na primeira vez que rodo retorna vazio.

Na segunda vez em diante retorna o mesmo erro que aparece pra você.

Por favor, dê uma olhada se pode me ajudar. O código abaixo está com o App e Requester Key...

Não sei como fechar essa comunicação... lembrando que estou usando o componente IDHTTP.

segue código...

var code : Integer;
    sResponse : String;
    Json : String;
    JsontoSend, AResponseContent : TStringStream;
    iStatusCode : Integer;
begin
  Json := '{"PhoneCountry": "+55",  "PhoneNumber": "19999999999",  "Name": "Daniel",  "IMEI": "123",  "DeviceKey": "123456", "DeviceId": "222555",';
  Json := Json +'"DeviceType": "MarcaModelo",  "OSName": "Android",  "OSVersion": "7.0",  "Email": "[email protected]",  "ZipCode": "13425066",  "City": "Piracicaba",  "State": "Sao Paulo",  "Enable": false}';

  JsonToSend := TStringStream.Create(Json);
  AResponseContent := TStringStream.Create('');
  try
   IdHTTP1.Request.Clear;
   IdHTTP1.Request.CharSet := 'UTF-8';
   IdHTTP1.Request.Method := 'POST';
   IdHTTP1.Request.Username := '';
   IdHTTP1.Request.Password := '';
   IdHTTP1.Request.ContentType := 'application/json';
   IdHTTP1.Request.CustomHeaders.AddValue('AppKey','58fb05c3-4e8b-4929-b7df-95bd261035c9');
   IdHTTP1.Request.CustomHeaders.AddValue('RequesterKey','629eda6f-9df5-40e7-a94e-4c54cec83a15');

   IdHTTP1.Response.ContentType := 'applicattion/json';
   IdHTTP1.Response.CharSet := 'UTF-8';
   try
     sresponse := IdHTTP1.Post('https://api.tudoentregue.com.br/v1/drivers',JsontoSend);
   except
     on E:EIdHTTPProtocolException do
     begin
       Memo1.Lines.Clear;
       Memo1.Lines.Add('Error on Request: ' + #13+#10 + e.Message);
       exit;
     end;
   end;
   Memo1.Lines.Clear;
   Memo1.Lines.Add(sResponse);

   finally
      JsontoSend.Free();
  end;
end;
 

consegui:

 Json := '{"PhoneCountry": "+55",  "PhoneNumber": "19999999999",  "Name": "Daniel",  "IMEI": "",  "DeviceKey": "", "DeviceId": "",';
 Json := Json + '"DeviceType": "MarcaModelo",  "OSName": "Android",  "OSVersion": "7.0",  "Email": "[email protected]",  "ZipCode": "13400000",  "City": "Piracicaba",  "State": "Sao Paulo",  "Enable": false}';
 AResponseContent := TStringStream.Create('');
 JsonToSend := TStringStream.Create(utf8Encode(Json));
 Try
  IdHTTP1.Request.Clear;
  IdHTTP1.Request.CharSet := 'utf-8';
  IdHTTP1.Request.ContentType := 'application/json';
  IdHTTP1.Request.CustomHeaders.AddValue('AppKey', '58fb05c3-4e8b-4929-b7df-95bd261035c9');
  IdHTTP1.Request.CustomHeaders.AddValue('RequesterKey', '629eda6f-9df5-40e7-a94e-4c54cec83a15');

  IdHTTP1.Response.ContentType := 'applicattion/json';
  IdHTTP1.Response.CharSet := 'utf-8';
  IdHTTP1.Post('http://api.tudoentregue.com.br/v1/drivers', JsontoSend, AResponseContent);
  //IdHTTP1.ResponseCode = 200 Atualização de Registro.
  //IdHTTP1.ResponseCode = 201 Inclusão de Registro.
  //IdHTTP1.ResponseCode = 422 Erro de Validação.

  showmessage(AResponseContent.DataString);
  showmessage(IdHTTP1.ResponseCode.ToString);
  showmessage(IdHTTP1.ResponseText);

 Finally
  JsontoSend.Free();
 End;

de acordo com a api

quando faz um post em /drivers

o Response vem vazio mesmo

o que valida a informação do post é o ResponseCode

  //IdHTTP1.ResponseCode = 200 Atualização de Registro.
  //IdHTTP1.ResponseCode = 201 Inclusão de Registro.
  //IdHTTP1.ResponseCode = 422 Erro de Validação.

mas quando faz um get em /drivers

ele responde os dados do motorista

mas de uma boa lida na api pois os codigos do ResponseCode são muito importantes

por exemplo quando faz um get em drivers:

//IdHTTP1.ResponseCode = 200 Processado com Sucesso. *e vem os dados do motorista no response*
//IdHTTP1.ResponseCode = 403 Motorista não Relacionado. *response vazio*
//IdHTTP1.ResponseCode = 404 Motorista não Localizado. *response vazio*

Postado

se quiser usar https é só ligar um IdSSLIOHandlerSocketOpenSSL1 ao IdHTTP1

e colocar as dlls ssleay32.dll e libeay32.dll

na mesma pasta da sua aplicação

Postado

Boa Tarde Datilas!

Deu certo! Consegui enviar.

Só que conversei com o suporte da Empresa e, para adicionar um motorista é em outro local... customers/addDriver.

Ficou assim essa rotina do motorista e fechou comunicação.

Só uma dúvida: Porque quando eu envio na primeira vez funciona certinho e da segunda vez em diante dá erro?

Veja como ficou o código abaixo que coloquei num botão e teste pra ver se pode me ajudar, por favor...

 

procedure TForm1.Button1Click(Sender: TObject);
var code : Integer;
    sResponse : String;
    Json : String;
    JsontoSend, AResponseContent : TStringStream;
    iStatusCode : Integer;
begin
  Json := '{"Customer": { "DocumentType" : "CNPJ", "DocumentNumber" : "11229082000167" }, "Driver": { "PhoneCountry": "+55",  "PhoneNumber": "19999690130",  "Name": "Daniel Marcelo"} }';
  JsonToSend := TStringStream.Create(Json);
  AResponseContent := TStringStream.Create('');
  try
   IdHTTP1.Request.Clear;
   IdHTTP1.Request.CharSet := 'utf-8';
   IdHTTP1.Request.ContentType := 'application/json';
   IdHTTP1.Request.CustomHeaders.AddValue('AppKey','58fb05c3-4e8b-4929-b7df-95bd261035c9');
   IdHTTP1.Request.CustomHeaders.AddValue('RequesterKey','629eda6f-9df5-40e7-a94e-4c54cec83a15');

   IdHTTP1.Response.ContentType := 'applicattion/json';
   IdHTTP1.Response.CharSet := 'utf-8';
   try
     IdHTTP1.Post('https://api.tudoentregue.com.br/v1/customers/AddDriver',JsontoSend, AResponseContent);
   except
     on E:EIdHTTPProtocolException do
     begin
       Memo1.Lines.Clear;
       Memo1.Lines.Add('Error on Request: ' + #13+#10 + e.Message);
       exit;
     end;
   end;
   Memo1.Lines.Clear;
   Memo1.Lines.Add('Response Content: '+AResponseContent.DataString);
   Memo1.Lines.Add('Response Code: ' + InttoStr(IdHTTP1.ResponseCode));
   Memo1.Lines.Add('Response Text: ' + IdHTTP1.ResponseText);
   finally
      JsontoSend.Free();
      AResponseContent.Free();
  end;
end;
 

 

 

Não sei como lhe agradecer em tudo que tem me ajudado!

Muito Obrigado mesmo e que Deus te abençoe!

Grande Abraço!

Daniel

  • Solution
Postado

remova o IdHTTP1 do seu formulario e tente usar assim:

Var
 code: Integer;
 sResponse: String;
 Json: String;
 JsontoSend, AResponseContent: TStringStream;
 iStatusCode: Integer;
 http: TIdHTTP;
Begin
 Json := '{"Customer": { "DocumentType" : "CNPJ", "DocumentNumber" : "11229082000167" }, "Driver": { "PhoneCountry": "+55",  "PhoneNumber": "19999690130",  "Name": "Daniel Marcelo"} }';
 JsonToSend := TStringStream.Create(Json);
 AResponseContent := TStringStream.Create('');
 http := TIdHTTP.Create(Nil);
 Try
  http.Request.CharSet := 'utf-8';
  http.Request.ContentType := 'application/json';
  http.Request.CustomHeaders.AddValue('AppKey', '58fb05c3-4e8b-4929-b7df-95bd261035c9');
  http.Request.CustomHeaders.AddValue('RequesterKey', '629eda6f-9df5-40e7-a94e-4c54cec83a15');

  http.Response.ContentType := 'applicattion/json';
  http.Response.CharSet := 'utf-8';
  Try
   http.Post('https://api.tudoentregue.com.br/v1/customers/AddDriver', JsontoSend, AResponseContent);
  Except
   On E: Exception Do
    Begin
     Memo1.Lines.Clear;
     Memo1.Lines.Add('Error on Response Code: ' + InttoStr(http.ResponseCode));
     Memo1.Lines.Add('Error on Response Text: ' + http.ResponseText);
     Memo1.Lines.Add('Error on Request: ' + sLineBreak + e.Message);
     exit;
    End;
  End;
  Memo1.Lines.Clear;
  Memo1.Lines.Add('Response Content: ' + AResponseContent.DataString);
  Memo1.Lines.Add('Response Code: ' + InttoStr(http.ResponseCode));
  Memo1.Lines.Add('Response Text: ' + http.ResponseText);
 Finally
  JsontoSend.Free;
  AResponseContent.Free;
  http.Free;
 End;

eu adicionei essas duas linhas:

     Memo1.Lines.Add('Error on Response Code: ' + InttoStr(http.ResponseCode));
     Memo1.Lines.Add('Error on Response Text: ' + http.ResponseText);

porque caso ResponseCode for 403,404,422 o indy vai levantar um except

sendo que

//IdHTTP1.ResponseCode = 403 Motorista não Relacionado. *response vazio*
//IdHTTP1.ResponseCode = 404 Motorista não Localizado. *response vazio*

então você não conseguiria tratar o erro de Motorista não Localizado por exemplo.

caso tenha resolvido seu problema marque o post como melhor resposta

clicando no sinal de ✔️ no canto superior esquerdo do post 

  • Curtir 3
  • Este tópico foi criado há 1898 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.