Como se indica en http://www.boutell.com/newfaq/misc/urllength.html , la cadena de consulta HTTP tiene una longitud limitada. Puede estar limitado por el cliente (Firefox, IE, ...), el servidor (Apache, IIS, ...) o el equipo de red (firewall aplicativo, ...).
Hoy me enfrento a este problema con un formulario de búsqueda. Desarrollamos un formulario de búsqueda con muchos campos, y este formulario se envía al servidor como una solicitud GET, por lo que puedo marcar la página resultante.
Tenemos tantos campos que nuestra cadena de consulta tiene una longitud de 1100 bytes y tenemos un firewall que elimina las solicitudes HTTP GET con más de 1024 bytes. Nuestro administrador de sistema nos recomienda utilizar POST en su lugar para que no haya limitaciones.
Claro, POST funcionará, pero realmente siento una búsqueda como GET y no como POST. Así que creo que revisaré nuestros nombres de campo para asegurarme de que la cadena de consulta no sea demasiado larga y, si no puedo, seré pragmático y usaré POST.
Pero, ¿hay alguna falla en el diseño de los servicios RESTful? Si tenemos una longitud limitada en la solicitud GET, ¿cómo puedo enviar objetos grandes a un servicio web RESTful? Por ejemplo, si tengo un programa que hace que los cálculos basados en un archivo, y quiero ofrecer un servicio web REST como esto: http://compute.com?content=<base64 file>
. Esto no funcionará porque la cadena de consulta no tiene una longitud ilimitada.
Estoy un poco perplejo ...
Respuestas:
Según su descripción, en mi humilde opinión, debería usar un POST. POST sirve para poner datos en el servidor y, en algunos casos, obtener una respuesta. En su caso, realiza una búsqueda (envía una consulta al servidor) y obtiene el resultado de esa búsqueda (recupera el resultado de la consulta).
La definición de GET dice que debe usarse para recuperar un recurso ya existente. Por definición, POST es crear un nuevo recurso. Esto es exactamente lo que está haciendo: ¡crear un recurso en el servidor y recuperarlo! Incluso si no almacena el resultado de la búsqueda, creó un objeto en el servidor y lo recuperó. Como PeterMmm dijo previamente, puede hacer esto con un POST (crear y almacenar el resultado de la consulta) y luego usar un GET para recuperar la consulta, pero es más práctico hacer solo un POST y recuperar el resultado.
¡Espero que esto ayude! :)
fuente
La especificación HTTP en realidad aconseja utilizar POST al enviar datos a un recurso para su cálculo.
Su búsqueda parece un cálculo, no un recurso en sí. Lo que podría hacer si aún desea que los resultados de su búsqueda sean un recurso es crear un token para identificar ese resultado de búsqueda específico y redirigir al agente de usuario a ese recurso.
Luego, puede eliminar los tokens de resultados de búsqueda después de un período de tiempo.
Ejemplo
entonces
De esta manera, los navegadores y los proxies aún pueden almacenar en caché los resultados de la búsqueda, pero usted está enviando sus parámetros de consulta mediante POST.
EDITAR
Para aclarar,
01543164876
aquí representa un ID único para el recurso que representa su búsqueda. Esas 2 solicitudes básicamente significan: crear un nuevo objeto de búsqueda con estos criterios, luego recuperar los resultados asociados con el objeto de búsqueda creado.Este ID puede ser un ID único generado para cada nueva solicitud. Esto significaría que su servidor filtrará objetos de "búsqueda" y tendrá que limpiarlos regularmente con una estrategia de almacenamiento en caché.
O puede ser un hash de todos los criterios de búsqueda que realmente representan la búsqueda solicitada por el usuario. Esto le permite reutilizar los ID, ya que volver a crear una búsqueda devolverá un ID existente que puede (o no) estar ya almacenado en caché.
fuente
REST es una forma de hacer las cosas, no un protocolo. Incluso si no le gusta POST cuando en realidad es un GET, funcionará.
Si debe / debe permanecer con la definición "estándar" de GET, POST, etc. que quizás considere POST una consulta, esa consulta se almacenará en el servidor con un ID de consulta y solicitará la consulta más tarde con GET by id.
fuente
Con respecto a su ejemplo:,
http://compute.com?content={base64file}
usaría POST porque está cargando "algo" para ser calculado. Para mí, este "algo" se siente más como un recurso que como un parámetro simple.En contraste con esto en la búsqueda habitual, comenzaría a seguir con GET y los parámetros. Haces que sea mucho más fácil para los clientes de API probar y jugar con tu API. ¡Haga que el acceso de solo lectura (que en la mayoría de los casos es la mayor parte del tráfico) sea lo más simple posible!
Pero el dilema de las cadenas de consulta grandes es una limitación válida de GET. Aquí me volvería pragmático, siempre que no alcance este límite, vaya con GET y url-params. Esto funcionará en el 98% de los casos de búsqueda. Solo actúe si alcanza este límite y luego también introduce POST con carga útil (con tipo mime
Content-Type: application/x-www-form-urlencoded
).¿Tienes más ejemplos del mundo real?
fuente
La confusión en torno a GET es una limitación del navegador. Si está creando una interfaz RESTful para una aplicación A2A o P2P, entonces no hay límite para la duración de su GET.
Ahora, si desea utilizar un navegador para ver su interfaz RESTful (también conocida como durante el desarrollo / depuración), se encontrará con este límite, pero existen herramientas para evitarlo.
fuente
Esta es una fácil. Utilice POST. HTTP no impone un límite en la longitud de la URL para GET, pero los servidores sí. Sea pragmático y solucione eso con un POST.
También podría usar un cuerpo GET (que está permitido) pero eso es un doble golpe, ya que no es un uso correcto y probablemente tendrá problemas con el servidor.
fuente