Crear un servicio web REST con ASP 1.0 clásico

Evidentemente, la tecnología escogida no es una nuestra elección; viene dada por los requisitos, y, a pesar de todas las justificaciones esgrimidas no ha sido posible cambiarlo.

Servidor web

Nuestro servidor web es un W 2003 con las características IIS activadas.

En la carpeta INETPUB, hemos creado como primer paso una carpeta para javascript donde hemos puesto las librerías JSON y JQUERY (en versión 1).

Recoger parámetros en Javascript desde la URL

La url que se invoca es algo como:

http://www.anyserver.com/mypage.asp?Details=products

En nuestra página ASP, vamos a usar las funciones de purl para sacar valores de la línea de parámetros

Verificar parámetros con expresiones regulares.

...
<script src="js/purl.js" language="javascript" type="text/javascript"></script>
...
<script type="text/javascript">
ip=$.url().param("ip") </script>

Coger parámetros en Classic ASP 1.0 desde url o cabecera

Esta es la forma de recogerlo de URL

IP = Request.QueryString("IP")

Si hay una cabecera propia, hay que anteponer http_ para poder extraerla, cómo explican en el foro de microsoft:

If a client request includes a header other than those specified in the IIS Server Variables table, you can retrieve the value of that header by preceding the header name with “HTTP_” in the call to Request.ServerVariables. For example, if the client sends a header such as SomeNewHeader:SomeNewValue, you can retrieve SomeNewValue by using the following synta

<% Request.ServerVariables("HTTP_SomeNewHeader") %>

Nosotros nos hemos hecho una función, para aceptar parámetros por url y por cabecera indistintamente:

Function GetParam (strTarget)
Dim param
param = Request.ServerVariables("HTTP_"&strTarget)
if (Len(param) = 0) then
param = Request.QueryString (strTarget)
End if
GetParam=param 'Return value
End Function

Respuesta del servidor

Todas las respuestas se hacen en forma de texto:

response.write Linea 1 & vbcrlf
response.write Linea 2 & vbcrlf

Gestión de logs desde Classic ASP 1.0
Hemos usado el código de Digital Colony, por que es inmejorable.

En la carpeta donde se guardan los logs, se debe dar permisos al usuario ASPNET de lectura y escritura.

Conexión a base de datos desde Classic ASP 1.0

Vamos a usar esta solución para prevenir inyección de sql en la base de datos.

Además, hemos creado un usuario con privilegios sólo de escritura sobre la base de datos, para prevenir cambios o consultas sobre otras base de datos.

strConnect = "DRIVER={SQL Server};SERVER=server\instance;DATABASE=my_Db;UID=my_uid;PWD=my_pwd;"
Set conn = Server.CreateObject("ADODB.Connection")
conn.ConnectionString = strConnect
conn.Open
(...)
conn.Close

Transacciones en base de datos desde ASP 1.0

Algunas de nuestras conexiones, las vamos a hacer dentro de una transacción:

conn.BeginTrans
(...)
conn.CommitTrans

 Función ExecuteScalar contra la base de datos desde Classic ASP 1.0

Hemos creado una función para recoger el primer resultado de una sentencia select.

Function executeScalar (strCommand)
Set command = CreateObject("ADODB.Command")
command.ActiveConnection = conn
command.CommandText = strCommand
Set rs = command.Execute ()
if not rs.EOF then
rs.movefirst
executeScalar = rs.fields(0)
else
executeScalar  = 0
End IF
Set rs = nothing
Set command = nothing
End Function

Gestión de errores de ASP

Para nuestro servicio Rest, hemos escogido la gestión más simple de las que proponen desde  codeguru:

En la cabecera de la página ASP:
<%
' Error Handler
' Turn on page buffering:
Response.Buffer = True
' Turn On Error Handling:
' On Error Resume Next so that errors don't stop page execution
On Error Resume Next
%>

(…) Código ASP de la página

Al final, se captura el error, se limpia la respuesta y se responde con el texto que se espere.

<%
' Error Handler
If Err.Number <> 0 Then
'Clear response buffer
Response.Clear
End If
%>

Más información

Vamos a comenzar por repasar los siguientes foros de información: