Página principal
Artículos y trucos
Catálogo de productos
Ejemplos y descargas
Mis libros
Cursos de formación
Investigación y desarrollo
Libros recomendados
Mis páginas favoritas
Acerca del autor
 
En colaboración con Amazon
 
Intuitive Sight

Nombres de dominio flexibles

Si usted desarrolla aplicaciones para Internet y tiene que utilizar varios ordenadores en el proceso de desarrollo, como es mi caso, recibirá este sencillo truco como una bendición.

El principal problema que me produce el cambio constante de ordenador es que, teniendo cada uno de ellos un nombre diferente, el Personal Web Server o el Internet Information Server les asigna nombres de dominio distintos. En el texto HTML generado, en muchas ocasiones, es necesario incluir el nombre completo del dominio. Es cierto también que las rutas relativas dentro del dominio inicial pueden ser de utilidad. Pero a veces no funcionan bien.

Para agravar el asunto, parte del texto HTML que sirve de semilla a las respuestas de la aplicación puede residir dentro del propio código o en ficheros HTML externos. El primer caso sería el de un componente como TPageProducer que tuviese asignada su propiedad HTMLDoc. El segundo caso sería el del mismo componente cuando hacer referencia a un fichero externo mediante la propiedad HTMLFile. Es decir, la referencia al nombre del dominio puede venir configurada en los más diversos formatos y ubicaciones.

Afortunadamente, existe un punto central dentro las aplicaciones Web escritas con Delphi en el cual podemos resolver el problema planteado. Se trata de la respuesta al evento AfterDispatch del módulo Web:

type
  THTTPMethodEvent = procedure (
    Sender: TObject; Request: TWebRequest; Response: TWebResponse;
    var Handled: Boolean) of object;

El evento se dispara cuando ya se han activado todas las acciones que tenían algo que decir. La respuesta se encuentra dentro de la propiedad Content del parámetro Response. El truco consiste en buscar dentro de la respuesta cierta cadena de caracteres, que utilizaremos como símbolo del nombre de dominio, y reemplazarla cuantas veces aparezca por el nombre de dominio verdadero.

Supongamos que el texto de cierta página que queremos generar es el siguiente:

<html>
<body>
<p>Visite nuestra
  <a href="$#!+/moreinfo.htm">página de información</a>.</p>
</body>
</html>

Observe que he utilizado la cadena $#!+ (una secuencia improbable, en circunstancias normales) como sustituto del nombre de dominio. Dentro de la unidad del módulo de datos defino dos constantes de alcance global:

const
  SDomainSymbol = '$#¡+';
  SDomain = 'http://naroa/scripts';

Debemos modificar el valor definido para SDomain cuando cambiamos de ordenador. Por supuesto, un truco más completo consistiría en sustituir la constante por una función inteligente que detecte o deduzca el nombre del dominio. Esto se lo dejo a usted.

El siguiente y último paso es interceptar el evento AfterDispatch:

procedure TmodData.WebModuleAfterDispatch(
  Sender: TObject; Request: TWebRequest; Response: TWebResponse;
  var Handled: Boolean);
begin
  if CompareText(Response.ContentType, 'text/html') = 0 then
    Response.Content := StringReplace(
      Response.Content, SDomainSymbol, SDomain, [rfReplaceAll]);
end;

Tome nota de la comprobación del valor de la propiedad ContentType; nuestra aplicación puede en ocasiones devolver un gráfico como resultado. La función StringReplace está definida en la unidad SysUtils.