Describió dos formas efectivas de solicitar varios idiomas. Cualquiera de los dos debería funcionar bien. Elegiría el parámetro de solicitud de idioma explícito para mi propio código.
TL; DR Historia de fondo
Hay un encabezado Accept-Language . Nota Accept
no Accepted
. Es una parte estándar de la negociación de contenido HTTP. La respuesta generalmente establece un encabezado Content-Language de nuevo.
Accept-Language
es la oferta inicial, que ofrece un conjunto de opciones; Content-Language
es la resolución, indicando qué idioma se eligió. La mayoría de las Content-Language
respuestas devuelven un solo idioma, pero hay una opción para proporcionar una lista de idiomas de respuesta separados por comas. Por lo general, eso sería contenido mixto, pero no hay razón para que no pueda señalar múltiples alternativas disjuntas. Si quería el cliente para solicitar todos los idiomas disponibles, ya hay una opción de solicitud de comodín, *
.
Entonces, ya existe un mecanismo de encabezado HTTP que puede usar. Sin embargo, tenga en cuenta que estaría aprovechando un proceso de negociación que con mayor frecuencia presenta una variedad de opciones posibles y recupera una sola opción. Cambiarías el sentido a "aquí hay una lista de opciones, ¡dame todas!" Si estás de acuerdo con eso, tienes una solución.
Sin embargo, existe un debate considerable sobre la idoneidad de la señalización de los parámetros de la API REST en los encabezados HTTP. Es un poco como entrar en un restaurante y dejar salir tu pedido detallado al anfitrión o al maître d 'en lugar de esperar a que aparezca el camarero o la camarera. Puede funcionar, y puede funcionar bien, por ejemplo, si la orden dirigida al anfitrión se relaciona con bebidas o aperitivos, cosas que el anfitrión puede ver rápidamente o comunicarse rápidamente con su servidor. Pero también puede verse como una violación del protocolo, dirigida en el nivel / capa incorrecto o al jugador equivocado.
Una segunda alternativa sería un parámetro de solicitud explícito. Usted sugiere ?all_languages=true
. Eso parece demasiado específico. Algo como lang=en,fr,es
(permitir múltiples idiomas listados) lang=*
o lang=all
(especificar cada idioma disponible) parece más general. Esto podría expresarse en la URL o en el cuerpo de la solicitud.
De cualquier manera, su respuesta multilingüe puede codificarse fácilmente en la carga útil JSON devuelta:
[ { "lang": "en", "content": "As Gregor Samsa awoke one morning..." },
{ "lang": "de", "content": "Als Gregor Samsa eines Morgens..." },
...
]
Al final, cualquiera de estos enfoques debería funcionar bien para usted. Cualquiera de los dos podría verse como un "diseño RESTful API consistente y bien estructurado". La determinación de cuál es mejor se basa principalmente en su actitud hacia la idoneidad de llevar a cuestas (y alterar ligeramente el sentido típico de) los encabezados de negociación de contenido HTTP.
Mi preferencia es no mezclar encabezados y otros parámetros como partes iguales de una solicitud de API. El explícito lang
o language
parámetro me parece más limpio. Pero dado que el verbo HTTP (por ejemplo GET
, PUT
, POST
, PATCH
, ...) es parte de la cabecera, y también crítica para / entremezclado con la interpretación de la solicitud, que admiten la distinción frente a contenidos sobre es un poco artificial y difusa. Como con la mayoría de las decisiones de diseño, los expertos genuinos responden de manera diferente, y YMMV.