PDA

Ver la Versión Completa : PHP / Rest DataSnap


Rockin
13-02-2017, 23:51:29
Hola, a ver si alguien me ilumina, tengo un servidor rest datasnap que recibe en unos de sus métodos una cadena enviada por php desde una web, pero no consigo codificar bien las tildes y la ñ. En el php hago: utf8_encode("EÑE ÓLA") lo que me lo convierte a EÑE ÓLA que es en UTF8 y en el servidor rest todas las rutinas que vienen en:
http://docwiki.embarcadero.com/RADStudio/Seattle/en/UTF-8_Conversion_Routines
Pero no hay forma, he probado con el tipo de campo varchar y nvarchar de SQL server.
Si alguien tiene una idea que puede ser.
Gracias.

AgustinOrtu
14-02-2017, 01:14:19
Vamos por partes, no podes depurar el servidor y ver "que es lo que recibes"? Despues te peleas con la base de datos para ver como lo guardas.

Tambien es importante el como lo lees desde la BD

Rockin
14-02-2017, 07:00:37
Tanto si envío con utf8_encode como sin eso recibo lo mismo:
E?L ?LA

¿Sabéis que puede ser?

AgustinOrtu
14-02-2017, 08:34:26
Solo se me ocurre que pruebes usando las clases para encoding, es decir, streams y TEncoding (http://docwiki.embarcadero.com/Libraries/en/System.SysUtils.TEncoding)

Yo creería un TStringStream con el string que viene y pasando como encoding TEncoding.UTF8.

De todos modos me extraña bastante. No podes publicar el código del servidor?

Rockin
14-02-2017, 17:53:11
Llega por el php que lo llamo así:

file_get_contents("http://localhost:8080/datasnap/rest/TServidorMetodosPrevengos/insertarSeguimientoCliente/$cadena");

En la variable $cadena concateno todos los parámetros.

El código del servidor es muy tonto.

function TServidorMetodosPrevengos.insertarSeguimientoCliente( id_UsuarioPrevengo, id_ClientePrevengo,id_EstadoVisita,id_Asesoria,
contratoFirmado : integer; fechaVisita,horaVisita: TDateTime;
incidencia:AnsiString ): String;
begin
try


with SPInsertarCliente do
begin
Close;
Params[0].Value;
Params[1].Value := id_UsuarioPrevengo;
Params[2].Value := id_ClientePrevengo;
Params[3].Value := id_EstadoVisita;
Params[4].Value := fechaVisita;
Params[5].Value := horaVisita ;
Params[6].Value := contratoFirmado ;
Params[7].Value:= id_Asesoria ;
Params[8].Value:= UTF8Decode(incidencia);
ExecProc;
Result:= 'OK'
end;



except
on E:Exception do
Result:= 'Error en el alta del seguimiento. Codigo de error: ' + E.Message;

end;

end;

AgustinOrtu
14-02-2017, 18:18:43
Porque usas AnsiString en lugar de string en el servidor?

Por otra parte no soy nada versado en PHP, pero me resulta extraño como invocas al server. Según la documentación deberías estar haciendo un GET a la URL especificada, o POST cuando tenés que mandar parámetros más complejos (ejemplo un JSON, se debe poner en el header y enviar por POST)

Revisa esto http://docwiki.embarcadero.com/RADStudio/en/DataSnap_REST_Messaging_Protocol

Rockin
14-02-2017, 18:43:00
He probado con string, ansistring,widestring, etc...
Los métodos se pueden invocar de varias maneras, esta es una de ellas, también por json, pero la parte php no la hago yo y el chaval que la hace no lo controla bien, era por simplificarlo.

Gracias.

Rockin
14-02-2017, 19:03:47
Al final era tan facil como codificar en el PHP rawurlencode ("EÑE ALá ñóé")

AgustinOrtu
14-02-2017, 20:49:38
Me alegra que lo hayan podido solucionar y gracias por publicarlo, son pequeños detalles que te salvan tardes enteras ^\||/^\||/