Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-08-2023
pablog2k pablog2k is offline
Miembro
 
Registrado: may 2017
Posts: 85
Poder: 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
  #2  
Antiguo 09-08-2023
Avatar de pgranados
pgranados pgranados is offline
Miembro
 
Registrado: sep 2022
Ubicación: México
Posts: 264
Poder: 2
pgranados Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 10-08-2023
pablog2k pablog2k is offline
Miembro
 
Registrado: may 2017
Posts: 85
Poder: 7
pablog2k Va por buen camino
Cita:
Empezado por pgranados Ver Mensaje
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 )
Responder Con Cita
  #4  
Antiguo 14-08-2023
Avatar de pgranados
pgranados pgranados is offline
Miembro
 
Registrado: sep 2022
Ubicación: México
Posts: 264
Poder: 2
pgranados Va por buen camino
Cita:
Empezado por pablog2k Ver Mensaje
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;
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
hacer post en java a una pagina especifica gulder JAVA 0 25-04-2016 04:55:57
Problema al hacer post en el insert 127 jhandervel Conexión con bases de datos 1 02-12-2013 21:17:00
¿Como abrir una pagina web desde Delphi enviandole parametros POST? flystar Varios 8 08-07-2010 23:13:49
Acelerar apertura de consulta desde Delphi contra Access Sergiov SQL 4 13-04-2007 10:42:59
Enviar Java desde Delphi mazinger Internet 8 13-05-2006 19:19:19


La franja horaria es GMT +2. Ahora son las 19:53:05.


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
Copyright 1996-2007 Club Delphi