Jump to content

Assista tectoy.png

INTEGRAÇÃO IFOOD


Go to solution Solved by luizcnr,
  • Este tópico foi criado há 620 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Galera,

Bom dia!

Estou com um problema, por alguns dias e não consigo resolver. Estou realizando a integração do meu sistema com o iFood.

Estou realizando alguns testes, por enquanto, estava obtendo sucesso, até tentar cadastrar o produto na API do iFood.

O procedimento que estou utilizando para cadastro é o seguinte:

procedure TfrmPrincipal.btnCriarProdutoClick(Sender: TObject);
var
  iStringListProduto : TStringList;
  iRespostaIfood : string;
  iJSON : string;
  iJSONStream : TStringStream;
  iJSONEnviar : TIdMultipartFormDataStream;
begin
  iJSONEnviar := TIdMultiPartFormDataStream.Create;

  try
    iJSON := ('{"merchantId": MerchantID,' + //CÓD DO RESTAURANTE
              '"externalCode":"205",' + 
              '"availability": "AVAILABLE",' + 
              '"name": "X BURGUER - TESTE",' + 
              '"description": "PÃO, HAMBURGUER E QUEIJO",' + 
              '"order": 1,' + 
              '"schedules": [],' +
              '"price":{' +
                 '"originalValue": 0,' +
                 '"promotional": false,' + 
                 '"value": 12.50}'+
               '}');  
    mRetorno.Lines.Clear;
    mRetorno.Lines.Add(iJSON);

    iJSONEnviar.AddFormField('sku', iJSON);

    //Configura o HTTP
    IdHTTPConexao.Request.Clear;
    //IdHTTPConexao.Request.CharSet             := 'UTF-8';
    IdHTTPConexao.Request.CustomHeaders.Clear;
    IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', iJSONEnviar.RequestContentType);
    IdHTTPConexao.Request.CustomHeaders.AddValue('Authorization', 'Bearer ' + self.fToken);
    IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', 'application/json');
    IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Disposition', 'form-data; name="sku"');
    IdHTTPConexao.Response.CharSet := 'UTF-8';

    try
      iRespostaIfood := IdHTTPConexao.Post('https://pos-api.ifood.com.br/v1.0/skus', iJSONEnviar);

      //201 = Indica que novos parâmetros foram criados com sucesso
      if IdHTTPConexao.ResponseCode = 201 then
        Application.MessageBox(PWideChar('Produto Cadastrado com Sucesso!'),
            'Informação', MB_OK+MB_ICONINFORMATION);
    except
      on e:EIdHTTPProtocolException do
      begin
        if (e.ErrorCode <> 200) or (e.ErrorCode <> 201) then
        begin
          Application.MessageBox(PWideChar('Atenção! Ocorreu ao Cadastrar Produto no iFood. ' +
              e.ErrorMessage),
                'Aviso', MB_OK+MB_ICONWARNING);
          Exit;
        end;
      end;
    end;
  finally

  end;
end;

Estou obtendo o seguinte retorno de erro:

---------------------------
Aviso
---------------------------
Atenção! Ocorreu ao Cadastrar Produto no iFood. 
<html><body><h1>Whitelabel Error Page</h1><p>This application has no explicit 
mapping for /error, so you are seeing this as a fallback.</p><div id='created'>
Tue Nov 05 10:50:01 GMT-03:00 2019</div><div>There was an unexpected error 
(type=Bad Request, status=400).</div><div>Unable to parse form content</div></body></html>

Obs. Esse mesmo JSON, executei no POSTMAN e estou obtendo um retorno positivo que o produto é cadastrado com sucesso, porém, o erro está no fonte e não estou conseguindo identificar.

Se alguém, conseguir me auxiliar ou ajudar.

Obrigado!

Link to comment
Share on other sites

33 minutos atrás, luizcnr disse:

Galera,

Bom dia!

Estou com um problema, por alguns dias e não consigo resolver. Estou realizando a integração do meu sistema com o iFood.

Estou realizando alguns testes, por enquanto, estava obtendo sucesso, até tentar cadastrar o produto na API do iFood.

O procedimento que estou utilizando para cadastro é o seguinte:

procedure TfrmPrincipal.btnCriarProdutoClick(Sender: TObject);
var
  iStringListProduto : TStringList;
  iRespostaIfood : string;
  iJSON : string;
  iJSONStream : TStringStream;
  iJSONEnviar : TIdMultipartFormDataStream;
begin
  iJSONEnviar := TIdMultiPartFormDataStream.Create;

  try
    iJSON := ('{"merchantId": MerchantID,' + //CÓD DO RESTAURANTE
              '"externalCode":"205",' + 
              '"availability": "AVAILABLE",' + 
              '"name": "X BURGUER - TESTE",' + 
              '"description": "PÃO, HAMBURGUER E QUEIJO",' + 
              '"order": 1,' + 
              '"schedules": [],' +
              '"price":{' +
                 '"originalValue": 0,' +
                 '"promotional": false,' + 
                 '"value": 12.50}'+
               '}');  
    mRetorno.Lines.Clear;
    mRetorno.Lines.Add(iJSON);

    iJSONEnviar.AddFormField('sku', iJSON);

    //Configura o HTTP
    IdHTTPConexao.Request.Clear;
    //IdHTTPConexao.Request.CharSet             := 'UTF-8';
    IdHTTPConexao.Request.CustomHeaders.Clear;
    IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', iJSONEnviar.RequestContentType);
    IdHTTPConexao.Request.CustomHeaders.AddValue('Authorization', 'Bearer ' + self.fToken);
    IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', 'application/json');
    IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Disposition', 'form-data; name="sku"');
    IdHTTPConexao.Response.CharSet := 'UTF-8';

    try
      iRespostaIfood := IdHTTPConexao.Post('https://pos-api.ifood.com.br/v1.0/skus', iJSONEnviar);

      //201 = Indica que novos parâmetros foram criados com sucesso
      if IdHTTPConexao.ResponseCode = 201 then
        Application.MessageBox(PWideChar('Produto Cadastrado com Sucesso!'),
            'Informação', MB_OK+MB_ICONINFORMATION);
    except
      on e:EIdHTTPProtocolException do
      begin
        if (e.ErrorCode <> 200) or (e.ErrorCode <> 201) then
        begin
          Application.MessageBox(PWideChar('Atenção! Ocorreu ao Cadastrar Produto no iFood. ' +
              e.ErrorMessage),
                'Aviso', MB_OK+MB_ICONWARNING);
          Exit;
        end;
      end;
    end;
  finally

  end;
end;

Estou obtendo o seguinte retorno de erro:

---------------------------
Aviso
---------------------------
Atenção! Ocorreu ao Cadastrar Produto no iFood. 
<html><body><h1>Whitelabel Error Page</h1><p>This application has no explicit 
mapping for /error, so you are seeing this as a fallback.</p><div id='created'>
Tue Nov 05 10:50:01 GMT-03:00 2019</div><div>There was an unexpected error 
(type=Bad Request, status=400).</div><div>Unable to parse form content</div></body></html>

Obs. Esse mesmo JSON, executei no POSTMAN e estou obtendo um retorno positivo que o produto é cadastrado com sucesso, porém, o erro está no fonte e não estou conseguindo identificar.

Se alguém, conseguir me auxiliar ou ajudar.

Obrigado!

pode ser por causa do acento na palavra "PÃO" tente converter o texto para utf-8 ou tira o acento para testar

Link to comment
Share on other sites

2 horas atrás, luizcnr disse:

Datilas, obrigado por responder.

Realizei o teste com o que vce me solicitou, mas ainda não deu certo

pelo que vi na documentação não preencher ('"schedules": [],' +) caso não exista.

{
 "merchantId": 999999,
 "ID do Restaurante (MerchantID)",
 "externalCode": "155",
 "COD PDV",
 "availability": "AVAILABLE", --"Disponibilidade do item",
 "name": "X BURGUER",
 "Nome do Item",
 "description": "PÃO, HAMBURGUER E QUEIJO", --" Descrição do Item (Composição)",
 "order": 0: "Ordem para o item aparecer no cardápio",
 "price": {
  "originalValue": 0: --"Valor Original do Item (Somente preencher caso o item estiver em promoção)",
  "promotional": false: --"Item está em promoção?"
  "value": 12 --"Valor do item (Valor que vai para aparecer na plataforma Ifood)"
 } 
}

//preencher apenas se existir (schedules)

{
 "merchantId": 999999,
 "ID do Restaurante (MerchantID)",
 "externalCode": 9430,
 "COD PDV"
 "availability": "AVAILABLE", --"Disponibilidade do item",
 "name": "Esfiha de Carne",
 "Nome do Item"
 "description": "Recheio com Mussarela.", --"Descrição do Item (Composição)",
 "schedules": [{
   --"Disponibilidade dos itens " Dias da semana e horário funcionamento ""
   "dayOfWeek": "MONDAY" --" Dia da semana que funciona"
  }, {
   "dayOfWeek": "FRIDAY" --" Dia da semana que funciona"

  }
 ],
 "order": 1, --"Ordem para o item aparecer no cardápio",
 "price": {
  "Preço"
  "originalValue": 3.96, --"Valor Original do Item (Somente preencher caso o item estiver em promoção)"
  "promotional": true,  --" Item está em promoção?"
  "value": 1.98 --"Valor promocional do item (Valor que vai para aparecer na plataforma Ifood)"
 }
}

 

Edited by datilas
Link to comment
Share on other sites

2 minutos atrás, datilas disse:

pelo que vi na documentação não preencher ('"schedules": [],' +) caso não exista.

{
 "merchantId": 999999,
 "ID do Restaurante (MerchantID)",
 "externalCode": "155",
 "COD PDV",
 "availability": "AVAILABLE",
 "Disponibilidade do item",
 "name": "X BURGUER",
 "Nome do Item",
 "description": "PÃO, HAMBURGUER E QUEIJO",
 " Descrição do Item (Composição)",
 "order": 0: "Ordem para o item aparecer no cardápio",
 "price": {
  "originalValue": 0: " Valor Original do Item (Somente preencher caso o item estiver em promoção)",
  "promotional": false: " Item está em promoção?"
  "value": 12
 }
 "Valor do item (Valor que vai para aparecer na plataforma Ifood)"
}

//preencher apenas se existir (schedules)

{
 "merchantId": 999999,
 "ID do Restaurante (MerchantID)",
 "externalCode": 9430,
 "COD PDV"
 "availability": "AVAILABLE",
 "Disponibilidade do item",
 "name": "Esfiha de Carne",
 "Nome do Item"
 "description": "Recheio com Mussarela.",
 "Descrição do Item (Composição)",
 "schedules": [{
   "Disponibilidade dos itens " Dias da semana e horário funcionamento ""
   "dayOfWeek": "MONDAY" " Dia da semana que funciona"
  }, {
   "dayOfWeek": "FRIDAY" " Dia da semana que funciona"

  }
 ],
 "order": 1,
 "Ordem para o item aparecer no cardápio",
 "price": {
  "Preço"
  "originalValue": 3.96,
  "Valor Original do Item (Somente preencher caso o item estiver em promoção)"
  "promotional": true,
  " Item está em promoção?"
  "value": 1.98 "Valor promocional do item (Valor que vai para aparecer na plataforma Ifood)"
 }
}

 

Então, eu já tentei das duas formas. No POSTMAN, eu usei o seguinte JSON:

{

"merchantId": 292468,

"availability": "AVAILABLE",

"externalCode":"201",

"name": "FANTA LATA",

"description": "",

"order": 2,

"schedules": [],

"price": {

"originalValue": 0,

"promotional": false,

"value": 12.50}

}

Foi retornado o código 201, sendo criado o produto na API do iFood. Eu acho que o problema, esteja no momento de passar os parâmetros no form-data.

Mas, ainda não descobri qual a forma correta de passar esse JSON para criar o produto, via Delphi.

 
Link to comment
Share on other sites

17 minutos atrás, luizcnr disse:

Então, eu já tentei das duas formas. No POSTMAN, eu usei o seguinte JSON:

{

"merchantId": 292468,

"availability": "AVAILABLE",

"externalCode":"201",

"name": "FANTA LATA",

"description": "",

"order": 2,

"schedules": [],

"price": {

"originalValue": 0,

"promotional": false,

"value": 12.50}

}

Foi retornado o código 201, sendo criado o produto na API do iFood. Eu acho que o problema, esteja no momento de passar os parâmetros no form-data.

Mas, ainda não descobri qual a forma correta de passar esse JSON para criar o produto, via Delphi.

 

tenta ssim:

Var
 iStringListProduto: TStringList;
 iRespostaIfood: String;
 iJSON: String;
 iJSONStream, AResponseContent: TStringStream;
 // iJSONEnviar : TIdMultipartFormDataStream;
Begin
 // iJSONEnviar := TIdMultiPartFormDataStream.Create;

 
 AResponseContent := TStringStream.Create('');
 Try
  iJSON := ('{"merchantId": MerchantID,' + //CÓD DO RESTAURANTE
   '"externalCode":"205",' +
   '"availability": "AVAILABLE",' +
   '"name": "X BURGUER - TESTE",' +
   '"description": "PÃO, HAMBURGUER E QUEIJO",' +
   '"order": 1,' +
   '"schedules": [],' +
   '"price":{' +
   '"originalValue": 0,' +
   '"promotional": false,' +
   '"value": 12.50}' +
   '}');
  mRetorno.Lines.Clear;
  mRetorno.Lines.Add(iJSON);
  iJSONStream := TStringStream.Create(iJSON);
  //Configura o HTTP
  IdHTTPConexao.Request.Clear;
  IdHTTPConexao.Request.CustomHeaders.Clear;
  IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', iJSONEnviar.RequestContentType);
  IdHTTPConexao.Request.CustomHeaders.AddValue('Authorization', 'Bearer ' + self.fToken);
  IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', 'application/json');
  //IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Disposition', 'form-data; name="sku"');
  IdHTTPConexao.Response.CharSet := 'UTF-8';

  Try
   IdHTTPConexao.Post('https://pos-api.ifood.com.br/v1.0/skus', iJSONStream, AResponseContent);
   iRespostaIfood := AResponseContent.DataString;

   //201 = Indica que novos parâmetros foram criados com sucesso
   If IdHTTPConexao.ResponseCode = 201 Then
    Application.MessageBox(PWideChar('Produto Cadastrado com Sucesso!'),
     'Informação', MB_OK + MB_ICONINFORMATION);
  Except
   On e: EIdHTTPProtocolException Do
    Begin
     If (e.ErrorCode <> 200) Or (e.ErrorCode <> 201) Then
      Begin
       Application.MessageBox(PWideChar('Atenção! Ocorreu ao Cadastrar Produto no iFood. ' +
        e.ErrorMessage),
        'Aviso', MB_OK + MB_ICONWARNING);
       Exit;
      End;
    End;
  End;
 Finally
  If Assigned(iJSONStream) Then
   FreeAndNil(iJSONStream);
  FreeAndNil(AResponseContent);
 End;

 

Edited by datilas
Link to comment
Share on other sites

9 minutos atrás, datilas disse:

tenta ssim:

Var
 iStringListProduto: TStringList;
 iRespostaIfood: String;
 iJSON: String;
 iJSONStream, AResponseContent: TStringStream;
 // iJSONEnviar : TIdMultipartFormDataStream;
Begin
 // iJSONEnviar := TIdMultiPartFormDataStream.Create;

 iJSONStream := TStringStream.Create(iJSON);
 AResponseContent := TStringStream.Create('');
 Try
  iJSON := ('{"merchantId": MerchantID,' + //CÓD DO RESTAURANTE
   '"externalCode":"205",' +
   '"availability": "AVAILABLE",' +
   '"name": "X BURGUER - TESTE",' +
   '"description": "PÃO, HAMBURGUER E QUEIJO",' +
   '"order": 1,' +
   '"schedules": [],' +
   '"price":{' +
   '"originalValue": 0,' +
   '"promotional": false,' +
   '"value": 12.50}' +
   '}');
  mRetorno.Lines.Clear;
  mRetorno.Lines.Add(iJSON);

  //Configura o HTTP
  IdHTTPConexao.Request.Clear;
  IdHTTPConexao.Request.CustomHeaders.Clear;
  IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', iJSONEnviar.RequestContentType);
  IdHTTPConexao.Request.CustomHeaders.AddValue('Authorization', 'Bearer ' + self.fToken);
  IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', 'application/json');
  //IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Disposition', 'form-data; name="sku"');
  IdHTTPConexao.Response.CharSet := 'UTF-8';

  Try
   IdHTTPConexao.Post('https://pos-api.ifood.com.br/v1.0/skus', iJSONStream, AResponseContent);
   iRespostaIfood := AResponseContent.DataString;

   //201 = Indica que novos parâmetros foram criados com sucesso
   If IdHTTPConexao.ResponseCode = 201 Then
    Application.MessageBox(PWideChar('Produto Cadastrado com Sucesso!'),
     'Informação', MB_OK + MB_ICONINFORMATION);
  Except
   On e: EIdHTTPProtocolException Do
    Begin
     If (e.ErrorCode <> 200) Or (e.ErrorCode <> 201) Then
      Begin
       Application.MessageBox(PWideChar('Atenção! Ocorreu ao Cadastrar Produto no iFood. ' +
        e.ErrorMessage),
        'Aviso', MB_OK + MB_ICONWARNING);
       Exit;
      End;
    End;
  End;
 Finally
  FreeAndNil(iJSONStream);
  FreeAndNil(AResponseContent);
 End;

 

Tentei das seguintes formas:

Onde estava o IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', iJSONEnviar.RequestContentType); como foi comentado, mudei para IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', 'multipart/form-data');

E me apresentou o seguinte erro:

---------------------------
Aviso
---------------------------
Atenção! Ocorreu ao Cadastrar Produto no iFood. 
<html><body><h1>Whitelabel Error Page</h1><p>
This application has no explicit mapping for /error, 
so you are seeing this as a fallback.</p><div id='created'>
Tue Nov 05 15:47:05 GMT-03:00 2019</div><div>There was an unexpected error 
(type=Internal Server Error, status=500).</div><div>java.lang.RuntimeException: 
java.io.IOException: Missing initial multi part boundary</div></body></html>

 

Se eu comentar a linha citada, me apresenta o erro seguinte erro:

---------------------------
Aviso
---------------------------
Atenção! Ocorreu ao Cadastrar Produto no iFood. 
<html><body><h1>Whitelabel Error Page</h1><p>
This application has no explicit mapping for /error, 
so you are seeing this as a fallback.</p><div id='created'>
Tue Nov 05 15:47:05 GMT-03:00 2019</div><div>There was an unexpected error 
(type=Internal Server Error, status=500).</div><div>java.lang.RuntimeException: 
java.io.IOException: Missing initial multi part boundary</div></body></html>

 

E de outra forma, se eu crio uma variável iJSONEnviar : TIdMultipartFormDataStream;

E passo em IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', iJSONEnviar.RequestContentType);

Me retorna o seguinte erro:

---------------------------
Aviso
---------------------------
Atenção! Ocorreu ao Cadastrar Produto no iFood. 
<html><body><h1>Whitelabel Error Page</h1><p>This application has no 
explicit mapping for /error, so you are seeing this as a fallback.</p>
<div id='created'>Tue Nov 05 15:54:19 GMT-03:00 2019</div><div>There was an unexpected error 
(type=Internal Server Error, status=500).</div><div>java.lang.RuntimeException: 
java.io.IOException: Missing initial multi part boundary</div></body></html>

Link to comment
Share on other sites

48 minutos atrás, luizcnr disse:

Tentei das seguintes formas:

Onde estava o IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', iJSONEnviar.RequestContentType); como foi comentado, mudei para IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', 'multipart/form-data');

E me apresentou o seguinte erro:

---------------------------
Aviso
---------------------------
Atenção! Ocorreu ao Cadastrar Produto no iFood. 
<html><body><h1>Whitelabel Error Page</h1><p>
This application has no explicit mapping for /error, 
so you are seeing this as a fallback.</p><div id='created'>
Tue Nov 05 15:47:05 GMT-03:00 2019</div><div>There was an unexpected error 
(type=Internal Server Error, status=500).</div><div>java.lang.RuntimeException: 
java.io.IOException: Missing initial multi part boundary</div></body></html>

 

Se eu comentar a linha citada, me apresenta o erro seguinte erro:

---------------------------
Aviso
---------------------------
Atenção! Ocorreu ao Cadastrar Produto no iFood. 
<html><body><h1>Whitelabel Error Page</h1><p>
This application has no explicit mapping for /error, 
so you are seeing this as a fallback.</p><div id='created'>
Tue Nov 05 15:47:05 GMT-03:00 2019</div><div>There was an unexpected error 
(type=Internal Server Error, status=500).</div><div>java.lang.RuntimeException: 
java.io.IOException: Missing initial multi part boundary</div></body></html>

 

E de outra forma, se eu crio uma variável iJSONEnviar : TIdMultipartFormDataStream;

E passo em IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', iJSONEnviar.RequestContentType);

Me retorna o seguinte erro:

---------------------------
Aviso
---------------------------
Atenção! Ocorreu ao Cadastrar Produto no iFood. 
<html><body><h1>Whitelabel Error Page</h1><p>This application has no 
explicit mapping for /error, so you are seeing this as a fallback.</p>
<div id='created'>Tue Nov 05 15:54:19 GMT-03:00 2019</div><div>There was an unexpected error 
(type=Internal Server Error, status=500).</div><div>java.lang.RuntimeException: 
java.io.IOException: Missing initial multi part boundary</div></body></html>

  // comenta essa linha IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', iJSONEnviar.RequestContentType);
  IdHTTPConexao.Request.CustomHeaders.AddValue('Authorization', 'Bearer ' + self.fToken); //deixa essa 
  IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', 'application/json');//deixa essa
  // comenta essa linha IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Disposition', 'form-data; name="sku"');
  IdHTTPConexao.Response.CharSet := 'UTF-8';

código limpo pra não confundir:

Var
 iRespostaIfood: String;
 iJSON: String;
 iJSONStream, AResponseContent: TStringStream;
Begin
 AResponseContent := TStringStream.Create('');
 Try
  iJSON := ('{"merchantId": MerchantID,' + //CÓD DO RESTAURANTE
   '"externalCode":"205",' +
   '"availability": "AVAILABLE",' +
   '"name": "X BURGUER - TESTE",' +
   '"description": "PÃO, HAMBURGUER E QUEIJO",' +
   '"order": 1,' +
   '"schedules": [],' +
   '"price":{' +
   '"originalValue": 0,' +
   '"promotional": false,' +
   '"value": 12.50}' +
   '}');
  mRetorno.Lines.Clear;
  mRetorno.Lines.Add(iJSON);
  iJSONStream := TStringStream.Create(iJSON);

  //Configura o HTTP
  IdHTTPConexao.Request.Clear;
  IdHTTPConexao.Request.CustomHeaders.Clear;
  IdHTTPConexao.Request.CustomHeaders.AddValue('Authorization', 'Bearer ' + self.fToken);
  IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', 'application/json');
  IdHTTPConexao.Response.CharSet := 'UTF-8';

  Try
   IdHTTPConexao.Post('https://pos-api.ifood.com.br/v1.0/skus', iJSONStream, AResponseContent);
   iRespostaIfood := AResponseContent.DataString;

   //201 = Indica que novos parâmetros foram criados com sucesso
   If IdHTTPConexao.ResponseCode = 201 Then
    Application.MessageBox(PWideChar('Produto Cadastrado com Sucesso!'),
     'Informação', MB_OK + MB_ICONINFORMATION);
  Except
   On e: EIdHTTPProtocolException Do
    Begin
     If (e.ErrorCode <> 200) Or (e.ErrorCode <> 201) Then
      Begin
       Application.MessageBox(PWideChar('Atenção! Ocorreu ao Cadastrar Produto no iFood. ' +
        e.ErrorMessage),
        'Aviso', MB_OK + MB_ICONWARNING);
       Exit;
      End;
    End;
  End;
 Finally
  FreeAndNil(iJSONStream);
  FreeAndNil(AResponseContent);
 End;

 

Link to comment
Share on other sites

8 minutos atrás, datilas disse:
  // comenta essa linha IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', iJSONEnviar.RequestContentType);
  IdHTTPConexao.Request.CustomHeaders.AddValue('Authorization', 'Bearer ' + self.fToken); //deixa essa 
  IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', 'application/json');//deixa essa
  // comenta essa linha IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Disposition', 'form-data; name="sku"');
  IdHTTPConexao.Response.CharSet := 'UTF-8';

Ficou dessa maneira o fonte:

iJSONStream := TStringStream.Create(iJSON, TEncoding.UTF8); (Nessa linha tentei passar somente o iJSON

    //Configura o HTTP
    IdHTTPConexao.Request.Clear;
    IdHTTPConexao.Request.CustomHeaders.Clear;
    IdHTTPConexao.Request.CustomHeaders.AddValue('Authorization', 'Bearer ' + self.fToken);
    IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', 'application/json');
    IdHTTPConexao.Response.CharSet := 'UTF-8';

    try
      IdHTTPConexao.Post('https://pos-api.ifood.com.br/v1.0/skus', iJSONStream, AResponseContent);
      iRespostaIfood := AResponseContent.DataString;

      //201 = Indica que novos parâmetros foram criados com sucesso
      if IdHTTPConexao.ResponseCode = 201 then
        Application.MessageBox(PWideChar('Produto Cadastrado com Sucesso!'),
            'Informação', MB_OK+MB_ICONINFORMATION);
    except
      on e:EIdHTTPProtocolException do
      begin
        if (e.ErrorCode <> 200) or (e.ErrorCode <> 201) then
        begin
          Application.MessageBox(PWideChar('Atenção! Ocorreu ao Cadastrar Produto no iFood. ' +
              e.ErrorMessage),
                'Aviso', MB_OK+MB_ICONWARNING);
          Exit;
        end;
      end;
    end;

É apresentado o seguinte erro:

---------------------------
Aviso
---------------------------
Atenção! Ocorreu ao Cadastrar Produto no iFood. 
<html><body><h1>Whitelabel Error Page</h1><p>This application has 
no explicit mapping for /error, so you are seeing this as a fallback.
</p><div id='created'>Tue Nov 05 16:56:09 GMT-03:00 2019</div><div>
There was an unexpected error (type=Unsupported Media Type, status=415).
</div><div>Unsupported Media Type</div></body></html>

Link to comment
Share on other sites

o que esta me encafifando é essa mensagem "Unsupported Media Type"

tenta assim

  IdHTTPConexao.Request.Clear;
  IdHTTPConexao.Request.ContentType := 'application/json';
  IdHTTPConexao.Request.CharSet := 'utf-8';
  IdHTTPConexao.Request.CustomHeaders.Clear;
  IdHTTPConexao.Request.CustomHeaders.AddValue('Authorization', 'Bearer ' + self.fToken);
  //IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', 'application/json');
  IdHTTPConexao.Response.ContentType := 'application/json';
  IdHTTPConexao.Response.CharSet := 'utf-8';

Edited by datilas
Link to comment
Share on other sites

5 minutos atrás, datilas disse:

o que esta me encafifando é essa mensagem "Unsupported Media Type"

tenta assim

  IdHTTPConexao.Request.Clear;
  IdHTTPConexao.Request.ContentType := 'application/json';
  IdHTTPConexao.Request.CharSet := 'utf-8';
  IdHTTPConexao.Request.CustomHeaders.Clear;
  IdHTTPConexao.Request.CustomHeaders.AddValue('Authorization', 'Bearer ' + self.fToken);
  //IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', 'application/json');
  IdHTTPConexao.Response.ContentType := 'application/json';
  IdHTTPConexao.Response.CharSet := 'utf-8';

Infelizmente continua com a mesma mensagem de erro.

Então, realmente... Já vi diversos exemplos e me retorna várias vezes esse erro de "Unsupported Media Type".

O teste que obtive o resultado de 201 via POSTMAN, gerou esse seguinte código:

POST /v1.0/skus HTTP/1.1
Host: pos-api.ifood.com.br
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Authorization: Bearer (tokenGerado)
User-Agent: PostmanRuntime/7.19.0
Accept: */*
Cache-Control: no-cache
Postman-Token: 76987055-3ed2-4452-a4b1-fcc1b740af63,140a3c1e-1692-4f6d-9584-66848489a7b3
Host: pos-api.ifood.com.br
Accept-Encoding: gzip, deflate
Content-Length: 410
Connection: keep-alive
cache-control: no-cache


Content-Disposition: form-data; name="sku"

{
  "merchantId": merchantId,  
  "availability": "AVAILABLE", 
  "externalCode":"201",
  "name": "FANTA LATA",
  "description": "",  
  "order": 2, 
  "schedules": [],
   "price": {
    "originalValue": 0,
    "promotional": false, 
    "value": 12.50} 
}
------WebKitFormBoundary7MA4YWxkTrZu0gW--

Link to comment
Share on other sites

  • 3 weeks later...
  • Solution

A solução encontrada, foi a seguinte:

 iJSONEnviar := TIdMultiPartFormDataStream.Create;

  try
    iJSON := ('{"merchantId": merchantID,' + //ID do Restaurante (MerchantID)",
              '"externalCode":"311",' + //COD PDV, código do sistema
              '"availability": "AVAILABLE",' + //Disponibilidade do item, AVAILABLE OU UNAVAILABLE
              '"name": "X BURGUER - TESTE 2",' + //Nome do Item,
              '"description": "",' + //Descrição do Item (Composição)
              '"order": 2,' + //Ordem para o item aparecer no cardápio
              '"schedules": [],' +
              '"price":{' +
                 '"originalValue": 0,' +//Valor Original do Item (Somente preencher caso o item estiver em promoção)
                 '"promotional": false,' + //Item está em promoção? True ou False
                 '"value": 12.50}'+
               '}');  //Valor do item (Valor que vai para aparecer na plataforma Ifood)

    mRetorno.Lines.Clear;
    mRetorno.Lines.Add(iJSON);

    iJSONEnviar.AddFormField('sku', iJSON, 'utf-8', 'application/json').ContentTransfer := '8bit';

    //Configura o HTTP
    IdHTTPConexao.Request.Clear;
    IdHTTPConexao.Request.ContentType := 'multipart/form-data; boundary=' + iJSonEnviar.Boundary;
    IdHTTPConexao.Request.CharSet := 'utf-8';
    IdHTTPConexao.Request.CustomHeaders.Clear;
    IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', 'multipart/form-data');
    IdHTTPConexao.Request.CustomHeaders.AddValue('Authorization', 'Bearer ' + self.fToken);
    IdHTTPConexao.Response.ContentType := 'application/json';
    IdHTTPConexao.Response.CharSet := 'utf-8';

    try
      IdHTTPConexao.Post('https://pos-api.ifood.com.br/v1.0/skus', iJSONEnviar);

      //201 = Indica que novos parâmetros foram criados com sucesso
      if IdHTTPConexao.ResponseCode = 201 then
        Application.MessageBox(PWideChar('Produto Cadastrado com Sucesso!'),
            'Informação', MB_OK+MB_ICONINFORMATION);
    except
      on e:EIdHTTPProtocolException do
      begin
        if (e.ErrorCode <> 200) or (e.ErrorCode <> 201) then
        begin
          Application.MessageBox(PWideChar('Atenção! Ocorreu ao Cadastrar Produto no iFood. ' +
              e.ErrorMessage),
                'Aviso', MB_OK+MB_ICONWARNING);
          Exit;
        end;
      end;
    end;
  finally
    FreeAndNil(iJSONEnviar);
  end;

  • Like 1
  • Thanks 1
Link to comment
Share on other sites

  • 9 months later...
  • Consultores
11 minutos atrás, Daniel Luis Dias disse:

 

Qual o mesmo problema?

Consultor SAC ACBr Juliomar Marchetti
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

 

Link to comment
Share on other sites

26 minutos atrás, Juliomar Marchetti disse:

Qual o mesmo problema?

Isso mesmo..

begin
  iJSONEnviar := TIdMultiPartFormDataStream.Create;
  Json :=  ('{"merchantId": xxxxxx,' + //ID do Restaurante (MerchantID)",
              '"externalCode":"311",' + //COD PDV, código do sistema
              '"availability": "AVAILABLE",' + //Disponibilidade do item, AVAILABLE OU UNAVAILABLE
              '"name": "X BURGUER - TESTE 2",' + //Nome do Item,
              '"description": "xxxxxx",' + //Descrição do Item (Composição)
              '"order": 2,' + //Ordem para o item aparecer no cardápio
              '"schedules": [],' +
              '"price":{' +
                 '"originalValue": 0,' +//Valor Original do Item (Somente preencher caso o item estiver em promoção)
                 '"promotional": false,' + //Item está em promoção? True ou False
                 '"value": 12.50}'+
               '}');  //Valor do item (Valor que vai para aparecer na plataforma Ifood)
  IdHTTPConexao := TidHTTP.Create;
  iJSONEnviar.AddFormField('sku', Json, 'utf-8', 'application/json').ContentTransfer := '8bit';
  try
    try
    with IdHTTPConexao do
    begin
      Request.Clear;
      Request.ContentType         := 'multipart/form-data; boundary=' + iJSONEnviar.Boundary;
      Request.Charset             := 'UFT-8';
      ProtocolVersion := pv1_1;
      Request.CustomHeaders.Clear;
      Request.CustomHeaders.AddValue('Content-Type', 'multipart/form-data');
      Request.CustomHeaders.AddValue('Authorization', 'Bearer '+Token);
      Response.ContentType := 'application/json';
      Response.CharSet := 'UFT-8';
      Post('https://pos-api.ifood.com.br/v1.0/skus', iJSONEnviar);
      Result:='ok';
    end;
    except on E: EIdHTTPProtocolException do
     Result:=IntToStr(E.ErrorCode);
    end;
  finally
   IdHTTPConexao.Free;
   jsonObject.Free;
  end;

 

Devolve sempre erro 415.....

Edited by Daniel Luis Dias
Link to comment
Share on other sites

iJSONEnviar.AddFormField('sku', iJSON, 'utf-8', 'application/json').ContentTransfer := '8bit';

    //Configura o HTTP
    IdHTTPConexao.Request.Clear;
    IdHTTPConexao.Request.ContentType := 'multipart/form-data; boundary=' + iJSonEnviar.Boundary;
    IdHTTPConexao.Request.CharSet := 'utf-8';
    IdHTTPConexao.Request.CustomHeaders.Clear;
    IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', 'multipart/form-data');
    IdHTTPConexao.Request.CustomHeaders.AddValue('Authorization', 'Bearer ' + self.fToken);
    IdHTTPConexao.Response.ContentType := 'application/json';
    IdHTTPConexao.Response.CharSet := 'utf-8';

Com esse meu código, eu recebi o retorno de 201, indicando que os novos parâmetros foram criados.

No meu código eu não precisei colocar essa linha  IdHTTPConexao := TidHTTP.Create;

Link to comment
Share on other sites

Obrigado Luiz, mas ainda não consegui. Estou criando o objeto em tempo de execução...Acredito que está faltando parâmetros e não sei quais são...Agora está aparecendo erro 400...Valeu a ajuda! 

 

AllowCookies := True;
     ProxyParams.BasicAuthentication := False;
     ProxyParams.ProxyPort := 0;
     HTTPOptions := [hoForceEncodeParams];
     IdHTTPConexao.Request.Clear;
     IdHTTPConexao.Request.Accept:='multipart/form-data';
     IdHTTPConexao.Request.ContentType := 'multipart/form-data; boundary=' + iJSonEnviar.Boundary;
     IdHTTPConexao.Request.CharSet := 'utf-8';
     IdHTTPConexao.Request.CustomHeaders.Clear;
     IdHTTPConexao.Request.CustomHeaders.AddValue('Content-Type', 'multipart/form-data');
     IdHTTPConexao.Request.CustomHeaders.AddValue('Authorization', 'Bearer ' +ini.ReadString('IFOOD','Token',''));
     IdHTTPConexao.Response.ContentType := 'application/json';
     IdHTTPConexao.Response.CharSet := 'utf-8';
     Post('https://pos-api.ifood.com.br/v1.0/skus',iJSONEnviar);

Edited by Daniel Luis Dias
Link to comment
Share on other sites

  • 2 weeks later...
  • Consultores

Onde é possível ter a documentação da API do iFood?

Consultor SAC ACBr Juliomar Marchetti
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

skype: juliomar
telegram: juliomar
e-mail: [email protected]
http://www.juliomarmarchetti.com.br
MVP_NewLogo_100x100_Black-02.png
Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil

 

Link to comment
Share on other sites

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.