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 14-03-2012
briast briast is offline
Miembro
NULL
 
Registrado: may 2011
Posts: 50
Poder: 13
briast Va por buen camino
Servidor ajax delphi

Hola.
Quiero implementar un pequeño servidor en delphi que responda a consultas ajax con datos en formato JSON.
Utilizo Delphi 2010 y he instalado la última versión de los componentes Indy 10 VCL.
En los ejemplos que vienen con los componentes tengo un servidor HTTP que funciona bien y responde en modo local/red a las solicitudes http realizadas desde el navegador web.
Hasta ahí bien.
Ahora quiero desde javascript lanzar consultas ajax para que me devuelva datos en formato json pero cuando hago la solicitud siempre me da un error:

XMLHttpRequest cannot load 169.254.1.1:81/?_dc=1331749722147. Origin null is not allowed by Access-Control-Allow-Origin

No se si con el componente Tidhttpserver se pueden responder a consultas XMLHttpRequest.
La llamada ajax la realizo desde sencha touch 2 con:
Código:
Ext.Ajax.request({
    url: 'myUrl',
    callback: function(response) {
        console.log(response.responseText);
    }
});
Quizás es que esto que quiero hacer no se puede hacer así.
En general lo que quiero es que mi aplicación Delphi pueda responder a peticiones realizadas desde javascript devolviéndole datos.
Hasta ahora lo había realizado con websockets en javascript y un servidor TCP en delphi, pero el problema es que los websockets no son compatibles con los navegadores con webkit por lo que me gustaría usar ajax para recoger los datos, pero el servidor no consigo implementarlo.
Gracias por la ayuda.
Responder Con Cita
  #2  
Antiguo 14-03-2012
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
El problema que estás teniendo no tiene nada que ver con tu servidor Delphi. El problema es la restricción de hacer una petición "AJAX" de dominio crusado o "Cross-Domain".

Te explico:
Si tu página junto a sus archivos Javascript fue servida desde "www.ejemplo.com", tú código Javascript no puede hacer peticiones HTTP a otro servidor que no sea al que provienen, en este caso "www.ejemplo.com". Así es por medidas de seguridad.

Sin embargo, con la popularización de las APIs web la necesidad de hacer peticiones entre dominios se ha vuelto necesaria. Es por esta razón que la W3 ha definido una arquitectura segura para hacerlas. Lo único que necesitas es un navegador moderno que permita hacer conexiones entre dominios y configurar tu servidor para permitirlas. Internet Explorer lo puede hacer desde su versión 8. Chrome y Firefox lo permiten desde hace varias versiones.

Para solucionar este problema, tienes que agregar un nuevo encabezado a las respuestas de tu servidor Delphi. El encabezado tiene que contener esto: "Access-Control-Allow-Origin: *". El asterísco indica que tu servidor acepta peticiones AJAX desde cualquier sitio web. Utiliza esta configuración con cuidado.

Si lo deseas restringir, para que por ejemplo solo acepte peticiones AJAX hechas por código servido desde "www.tu-sitioweb.com", entonces el encabezado HTTP del servidor debe ser "Access-Control-Allow-Origin: www.tu-sitioweb.com".

Lo que veo raro es que el origen de la petición AJAX sea null. No sé si esto te puede dar problemas porque nunca he visto esta situación. Talvez por el momento se resuelva con el valor * para Access-Control-Allow-Origin.

Puedes aprender más sobre peticiones AJAX de dominio cruzado en este artículo del sitio de Mozilla para Desarrolladores web.

Saludos!
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web

Última edición por Chris fecha: 14-03-2012 a las 23:50:30.
Responder Con Cita
  #3  
Antiguo 15-03-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Chris Ver Mensaje
Para solucionar este problema, tienes que agregar un nuevo encabezado a las respuestas de tu servidor Delphi. El encabezado tiene que contener esto: "Access-Control-Allow-Origin: *". El asterísco indica que tu servidor acepta peticiones AJAX desde cualquier sitio web. Utiliza esta configuración con cuidado.

Si lo deseas restringir, para que por ejemplo solo acepte peticiones AJAX hechas por código servido desde "www.tu-sitioweb.com", entonces el encabezado HTTP del servidor debe ser "Access-Control-Allow-Origin: www.tu-sitioweb.com".
Muy interesante Chris. Desconocía esta funcionalidad.

// Saludos
Responder Con Cita
  #4  
Antiguo 15-03-2012
briast briast is offline
Miembro
NULL
 
Registrado: may 2011
Posts: 50
Poder: 13
briast Va por buen camino
Hola Chris. Gracias por tu respuesta.
Efectivamente, cuando me dio el error busqué en google y vi lo comentas.
Desde sencha touch también se puede enviar la petición ajax para cross-domain:
Código:
Ext.Ajax.request({
    url: 'http://www.somedomain.com/some/awesome/url.php',
    withCredentials: true,
    useDefaultXhrHeader: false
});
El problema es que tampoco funciona contra mi servidor en Delphi.
Como bien dices, el servidor debería devolver la cabecera que indicas para permitirlo, pero lo que no sé hacer es como indicarle al servidor que lo devuelva, ya que el componente TIdHTTPServer no tiene ninguna propiedad (o al menos yo no la veo) para hacer eso.
¿Quizás debería yo enviarlo en la propia respuesta? No creo, porque supongo que eso será en la negociación inicial de la conexión ajax con el servidor.
En fin que no veo como implementarlo en Delphi con el TIdHTTPServer.
Un saludo
Responder Con Cita
  #5  
Antiguo 15-03-2012
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
withCredentials no es para hacer peticiones de dominio cruzado. withCredentials es para enviar las credenciales (cookies) que tiene, por ejemplo "www.tu-sitio.com" a "www.otrositio.com" en una petición AJAX. Tú sabes que las cookies no pueden intercambiarce entre dominios. Esta variable funciona como un "workaround" para eso.

Sinceramente nunca he trabajado con TIdHTTPServer. Pero parece que tendrás que utilizar el evento OnCreatePostStream del componente. El evento antes dicho te proporciona una variable llamada AHeaders. Es ésta dónde manipulas los encabezados devueltos por la petición. Tal vez te funcione este código:
Código Delphi [-]
procedure TForm2.IdHTTPServer1CreatePostStream(AContext: TIdContext;
  AHeaders: TIdHeaderList; var VPostStream: TStream);
begin
    AHeaders.Values['Access-Control-Allow-Origin'] := '*';
end;

Saludos!
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #6  
Antiguo 16-03-2012
briast briast is offline
Miembro
NULL
 
Registrado: may 2011
Posts: 50
Poder: 13
briast Va por buen camino
Ok. Es lo que pone en la documentación de Sencha Touch 2.
De todas formas, ya he resuelto el problema de otra manera y es con una llamada:
Código:
Ext.util.JSONP.request(..)
Con esta llamada, el servidor responde perfectamente y me envía los datos en formato json que posteriormente puedo tratar.

Gracias por la ayuda.
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
Towards a Delphi REST framework (with AJAX frontend) FrancisR Internet 1 14-01-2008 22:23:35
AJAX en Delphi 2006.net maco2007 Internet 1 03-11-2007 05:17:48
Delphi for Php, Ajax y caracteres especiales. maro PHP 4 24-10-2007 07:19:52
php+ajax+ie halizia HTML, Javascript y otros 1 06-09-2007 13:47:00
Ajax dayrontbs HTML, Javascript y otros 0 29-08-2007 20:04:41


La franja horaria es GMT +2. Ahora son las 14:40:36.


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