luizcnr 6 Report post Posted November 5 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
datilas 80 Report post Posted November 5 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
luizcnr 6 Report post Posted November 5 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
datilas 80 Report post Posted November 5 (edited) 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 November 5 by datilas Share this post Link to post Share on other sites
luizcnr 6 Report post Posted November 5 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
datilas 80 Report post Posted November 5 (edited) 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 November 5 by datilas Share this post Link to post Share on other sites
luizcnr 6 Report post Posted November 5 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
datilas 80 Report post Posted November 5 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
luizcnr 6 Report post Posted November 5 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
datilas 80 Report post Posted November 5 (edited) 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 November 5 by datilas Share this post Link to post Share on other sites
luizcnr 6 Report post Posted November 5 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
luizcnr 6 Report post Posted November 6 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
Mr.Joe 0 Report post Posted November 22 Alguém conseguiu uma solução? Estou passando pelo mesmo problema. Share this post Link to post Share on other sites
luizcnr 6 Report post Posted November 25 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; 1 Share this post Link to post Share on other sites