Ver Mensaje Individual
  #1  
Antiguo 09-08-2023
pablog2k pablog2k is offline
Miembro
 
Registrado: may 2017
Posts: 85
Reputación: 7
pablog2k Va por buen camino
Problema al hacer Post desde Delphi XE contra una API en Java

Hola amigos, estoy teniendo problemas para conectar con una API hecha en java.
El problema solo me ocurre en Delphi XE, pues si utilizo Postman o similares, funciona perfecto.
La llamada a la API se realiza mediante un POST, y como parámetros se le pasan un archivo pdf y un json (adjunto captura de Postman, donde funciona correctamente)



En delphi lo he intentado de varias maneras, siempre devolviéndome el mismo error:
"La etiqueta 'metadata' debe contener un JSON."

Opcion 1
Código:
postData := TIdMultiPartFormDataStream.Create();
IdHTTP.Request.ContentType := 'multipart/form-data';

jsonObject := TJSONObject.Create;
jsonObject.AddPair('company_id','123');
jsonObject.AddPair('producer_id','456');
lRequest := TStringStream.Create(jsonObject.ToString, TEncoding.UTF8);
postData.AddFormField('metadata','application/json','utf-8',lRequest);
postData.AddFile('files',rutaFichero,'application/pdf');
IdHTTP.Post(Url,postData,LResponse);
Tambien he probado a enviar el json directo, en formato json 'simulado' (variable MyJson) y en string en vez de convertirlo a StringStream, pero tampoco funciona

Opcion 2
Código:
MyJson:='{' + CRLF +
  ' "company_id": "123",' + CRLF +
  ' "producer_id": "456"' + CRLF +
'}';
postData.AddFormField('metadata','{"company_id":"123","producer_id":"456"}');
//postData.AddFormField('metadata',MyJson);
postData.AddFile('files',rutaFichero,'application/pdf');
IdHTTP.Post(Url,postData,LResponse);
También he probado en vez de usar las librerías INDY, utilizar las librerias WinInet (no adjunto código porque no creo que sea problema de librería), pero sigue fallando.

Me da la sensación que es un problema en como Delphi crea el string y luego lo recibe Java.
He probado con conversiones del string de la variable metadata a utf8 string y similares, pero tampoco funciona.
Siempre que he utilizado alguna API me ha funcionado con la opcion 1 (enviar memorystream), incluso alguna API que hemos desarrollado en java, de esta manera funcionaba.

Muchas gracias
Responder Con Cita