El día de hoy me levante con una firme determinación… Y era jugar futbolín y ver morir el viernes solucionar un problema que ayer me tuvo dos horas dándole vueltas, y con el que lamentablemente tuve que compartir la habitación esta madrugada.

Lo que sucedió era que estaba implementando un AJAX para alimentar los datos de un script PHP, y normalmente enviando los datos por GET, no había experimentado mayores problemas, no obstante en esta oportunidad la cantidad de bytes rebasaba por mucho la limitada capacidad del GET.

Antes de continuar, aclarare este punto para que lo tengamos de referencia…

¿Tiene límite el número de caracteres que se pueden pasar por GET ($_GET)?

En efecto así es. A mediados del año 1998 se hizo pública la especificación del protocolo HTTP, un documento bastante completo, pero impreciso en cuanto al límite máximo de los datos transferidos a través de GET, por lo que tiempo después los navegadores por si mismos han despachado sus propias especificaciones.
 
Destacamos los límites de los más populares:
  • Internet Explorer: 2.083 caracteres
  • FireFox: 65.536 caracteres
  • Safari: 80.000 caracteres
  • Opera: 190.000 caracteres
Así
mismo dependiendo de la plataforma y del servidor web, debemos considerar otros estándares, tales como por ejemplo:
  • Apache: 4.000 caracteres
  • Microsoft Internet Information Server (IIS): 16.384 caracteres.
Considerando lo anterior fácilmente podríamos definir que para datos superiores a los 2000 caracteres es preferible pasarlos por POST.

Ahora; volviendo al tema en el que me levante esta mañana, les comento que es muy común en la vida de los desarrolladores profesionales que debido al cansancio físico y mental, en muchos casos podemos durar horas solucionando un problema, que en otras circunstancias solo nos tomaría algunos minutos.
En este caso no fue la excepción :-)

El código original que envía datos por GET es el siguiente:

xml.open('get', 'http://www.dominio.com/script.php?variable_get=hola');
xml.onreadystatechange = handleResults;
xml.send(null);


Ahora, para que podamos enviar datos por POST, lo que debemos sumar es una cabecera de datos, como lo hago a continuación:

   
xml.open('post', 'http://www.dominio.com/script.php?variable_get=hola');
xml.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=ISO-8859-1');
xml.send("variable_post=1&variable_post2=1");

El problema radicaba en que para enviar datos por POST hay que enviar previamente una cabezera que nos permita almacenar los contenidos.