300

Multiple Choices

El menú de opciones de HTTP que dice "tú decides". Content negotiation, variantes y el arte de elegir. Raramente usado pero muy útil.

🤔 Redirection

📋 ¿Qué narices es esto?

El código 300 Multiple Choices es el "aquí tienes varias opciones, elige tú" de HTTP. Es cuando el servidor tiene múltiples variantes del mismo recurso y no puede decidir automáticamente cuál enviarte. Como cuando llegas a un restaurante y el camarero te dice "tenemos tres versiones del mismo plato, ¿cuál prefieres?".

Este código se usa principalmente en content negotiation (negociación de contenido), donde un mismo recurso puede estar disponible en diferentes idiomas, formatos, calidades o versiones. El servidor construye una lista de opciones disponibles y delega la decisión al cliente. A diferencia de otros 3xx, el 300 no redirecciona automáticamente - te para y dice "necesito que elijas".

El 300 aparece típicamente en:

  • Sitios con múltiples idiomas sin detección automática
  • APIs que devuelven datos en diferentes formatos (JSON, XML, CSV)
  • Recursos con versiones múltiples (calidades de imagen, resoluciones)
  • Transparent Content Negotiation de Apache (muy raro)
  • Sistemas de documentación con formatos alternativos

🎯 Dato curioso

El 300 es como el político de los códigos HTTP: evita tomar decisiones difíciles y las pasa al usuario. La mayoría de navegadores lo manejan mal o lo ignoran, por eso es tan raro verlo en la vida real.

La respuesta 300 debe incluir una lista de alternativas en el body (típicamente HTML con enlaces) y puede incluir un header Location con la opción preferida del servidor. El problema es que no hay forma estándar de elegir automáticamente, por eso la mayoría de servidores prefieren hacer la negociación internamente y devolver 200 directamente.

🔧 Cómo implementar esto

🖥️ Para servidores

  1. Detecta múltiples variantes: Mismo recurso en diferentes formatos/idiomas.
  2. Evalúa headers del cliente: Accept, Accept-Language, Accept-Encoding.
  3. Si no puede decidir automáticamente: Responde 300 con lista de opciones.
  4. Incluye Location header: Con la variante preferida del servidor.
  5. Construye body descriptivo: HTML con enlaces a cada variante.

📱 Para clientes

  1. Detecta respuesta 300: Parsea lista de opciones disponibles.
  2. Examina Location header: Puede indicar opción preferida del servidor.
  3. Presenta opciones al usuario: O implementa lógica de selección automática.
  4. Realiza nueva request: A la variante elegida.
  5. Maneja fallback gracefully: Muchos browsers ignoran 300.

Problemas típicos con 300

  • Selección del cliente complicada:
    Si el cliente no maneja correctamente el 300, la respuesta puede ser inefectiva.
  • Navegadores que ignoran 300:
    Muchos navegadores prefieren manejar la negociación internamente y no muestran la lista de opciones.

🚀 Respuesta rápida para emergencias

🔥 Si estás implementando 300:
1. Evalúa si realmente necesitas ofrecer tantas opciones
2. Considera el uso de 406 si no puedes hacer una negociación eficiente
3. Proporciona una opción preferida para evitar la confusión
🎯 Truco ninja:
Si el cliente no puede elegir adecuadamente, considera devolver 406 para manejar las negociaciones sin ambigüedad.