Ir para conteúdo
  • Cadastre-se

dev botao

INTEGRAÇÃO IFOOD


Ver Solução Respondido por luizcnr,
  • Este tópico foi criado há 1218 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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)"
 }
}

 

Editado por datilas
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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;

 

Editado por datilas
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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';

Editado por datilas
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

  • 3 semanas depois ...
  • 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;

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

  • 9 meses depois ...
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.....

Editado por Daniel Luis Dias
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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);

Editado por Daniel Luis Dias
Link para o comentário
Compartilhar em outros sites

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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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.