Jump to content

Promoção de Natal SAC Mensal

Contrate e ganhe 1 Kit agenda + Caneta
Saiba mais

LANÇAMENTO
Curso Completo - Dominando o ACBrMonitor

Conheça o Curso

Balança SM100 performance surpreendente

Tecnologia Japonesa   Teclado e Visor resistentes a água
Consumo inteligente de etiquetas   Baixo custo de manutenção
Comunicação Ethernet e WIFI independentes

Saiba mais

Impressora de Etiquetas ELGIN - L42 PRO

Protocolos PPLA, PPLB, ZPL, EPL (automático)
Porta USB padrão Opcionais: Ethernet, Serial, Paralela
Sensor de Etiquetas Móvel Garantia de 18 meses

Saiba mais

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!

Share this post


Link to post
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

Share this post


Link to post
Share on other sites
1 hora atrás, datilas disse:

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

Datilas, obrigado por responder.

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

Share this post


Link to post
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

Share this post


Link to post
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.

 

Share this post


Link to post
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

Share this post


Link to post
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>

Share this post


Link to post
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;

 

Share this post


Link to post
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>

Share this post


Link to post
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

Share this post


Link to post
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--

Share this post


Link to post
Share on other sites

Alguém por aí, consegue ter alguma ideia do que possa ser?

Já estou perdido, sem saber muito o que fazer...

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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