Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Problema al hacer Post desde Delphi XE contra una API en Java (https://www.clubdelphi.com/foros/showthread.php?t=96328)

pablog2k 09-08-2023 14:37:52

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

pgranados 09-08-2023 16:31:43

Te recomiendo utilizar RESTDebugger, haz las pruebas y ya cuando te funcione solamente copia los componentes a tu formulario y listo.

https://www.embarcadero.com/free-tools/rest-debugger

pablog2k 10-08-2023 08:03:39

Cita:

Empezado por pgranados (Mensaje 552290)
Te recomiendo utilizar RESTDebugger, haz las pruebas y ya cuando te funcione solamente copia los componentes a tu formulario y listo.

https://www.embarcadero.com/free-tools/rest-debugger

gracias por la respuesta.
En rest-debugger no puedes utilizar el content-type multipart/form-data , con lo que no me sirve ( ya lo estuve utilizando pero no se puede simular la llamada que necesito )

pgranados 14-08-2023 22:40:23

Cita:

Empezado por pablog2k (Mensaje 552296)
gracias por la respuesta.
En rest-debugger no puedes utilizar el content-type multipart/form-data , con lo que no me sirve ( ya lo estuve utilizando pero no se puede simular la llamada que necesito )

Intenta hacerlo con los componentes de Indy. Aquí te dejo un ejemplo

Código Delphi [-]
var
IdHTTP1: TIdHTTP;
ResponseSolicitud:TStringStream;
SOAPAction, ServiceURL: string;

begin
  SOAPAction := 'URL';
  ServiceURL := 'URL';
  ResponseSolicitud:= TStringStream.Create('');
  try
    IdHTTP1.Request.ContentType := 'text/xml;charset=UTF-8';
    IdHTTP1.Request.CustomHeaders.AddValue('Authorization','WRAP access_token="'+MiToke+'"');
    IdHTTP1.Request.CustomHeaders.AddValue('SOAPAction', SOAPAction);
    IdHTTP1.Request.Host:= 'HOST';
    IdHTTP1.Request.ContentLength:= 4546;
    IdHTTP1.Request.CustomHeaders.AddValue('Expect', '100-continue');
    IdHTTP1.Request.AcceptEncoding:= 'gzip, deflate';
    IdHTTP1.Post(ServiceURL, RequestSolicitud, ResponseSolicitud);
    ResponseSolicitud.SaveToFile('C:\Archivos\Responde.xml');
  finally
    IdHTTP1.Free;
    RequestSolicitud.Free;
    ResponseSolicitud.Free;
  end;
end;


La franja horaria es GMT +2. Ahora son las 17:17:41.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi