Al ejecutar una API, si corrijo un encabezado de tipo contenido, ¿eso romperá las cosas para los clientes?


14

Estamos ejecutando una API con bastante gente usándola. Debido a cierta torpeza heredada de mi parte, uno de los puntos finales está devolviendo el encabezado de tipo de contenido incorrecto , jscuando debería ser json. Mi pregunta es, si solucionamos esto intercambiando para devolver el valor correcto, ¿qué tan mal podría estropear las cosas para nuestros clientes existentes? O para decirlo de otra manera, ¿esperaría que muchas bibliotecas de clientes HTTP diferentes arrojen errores fatales al ver tal cambio?

Estamos tratando de decidir si este es un cambio que podemos seguir y hacer sin sudar demasiado, o deberíamos enviar un correo electrónico a todos los usuarios y anunciar un período de desaprobación de varios años ... o algo intermedio.

Probablemente depende un poco de qué tipo de clientes HTTP diferentes están en uso, así que eché un vistazo a los agentes de usuario. Respuesta: ¡muchos diferentes! Aquí hay algunos de los mejores:

"okhttp / 3.2.0", "solicitudes de pitón / 2.10.0", "Ruby", "solicitudes de pitón / 2.7.0", "Mozilla / 5.0", "Java / 1.8.0_91", "solicitudes de pitón /2.4.3 "," okhttp / 3.3.0 "," Lucee "," Dalvik / 2.1.0 "," Google-HTTP-Java-Client / 1.21.0 "," PHP_appname "," NativeHost "," Java /1.7.0_67 "," Apache-HttpClient / UNAVAILABLE "," Dalvik / 1.6.0 "," Web-sniffer / 1.1.0 "," unirest-objc / 1.1 "

Varias bibliotecas de idiomas móviles y de servidor diferentes. La mayoría de las veces no son navegadores que ejecutan JavaScript, sino también algunos de ellos.

La mayoría de las personas no parecen darse cuenta de que el tipo de contenido es incorrecto, pero de vez en cuando aparece una nueva solicitud de soporte quejándose de este problema, por lo que nos gustaría solucionarlo.


44
Supongo que los clientes que funcionan correctamente con un encabezado de tipo de contenido incorrecto no dejarán de funcionar una vez que configure el correcto, pero ya sabe lo que dicen sobre los supuestos. Por lo tanto, pruebe, comunique sus cambios a su base de usuarios por adelantado y / o incorpore una lógica adicional que si un determinado cliente se rompe, puede detectar ese cliente en particular y seguir devolviendo el encabezado de tipo de contenido incorrecto (o hacer lo contrario, regresar el correcto para aquellos clientes que generan tickets de soporte y mantienen todo igual para los usuarios / agentes de usuario actuales).
HBruijn

55
xkcd obligatorio: xkcd.com/1172
njzk2

¿No estás versionando tu API?
Michael Hampton

Solo tenemos un número de versión principal para toda la API que solo buscaríamos encontrar en unos años cuando realizamos algunas reestructuraciones bastante importantes. En ese punto, solucionaríamos este problema, por supuesto, pero ... parece que nunca podremos hacer esto. Es uno de esos números de versión.
Harry Wood

Respuestas:


30

¿Cuán mal podría estropear las cosas para nuestros clientes existentes?

Podría hundir completamente sus acorazados si han escrito un código que se basa en que este tipo de contenido es incorrecto.

No esperaría que las bibliotecas arrojaran errores, pero espero que en algunos casos las bibliotecas estrictas hayan anulado su comportamiento para manejar el tipo MIME incorrecto.

Si su API tiene un valor de versión / revisión en un campo de solicitud en alguna parte, instálelo y en la nueva versión devuelva el tipo correcto pero continúe devolviendo el tipo incorrecto en las versiones anteriores. Si no tiene ese campo de solicitud, ahora es un buen momento para agregar uno.


66
+1 por una buena hipérbole
HBruijn

44
A menudo no tienes otra opción. Los clientes que reciben un ultimátum de "actualizar o dejar" pueden decidir sobre este último, bueno en principio, malo en la práctica. La versión anterior se puede retirar con el tiempo.
alzee

3
+1 para versionar las solicitudes, aunque es posible que desee consultar en.wikipedia.org/wiki/Software_versioning para obtener más información.
SBoss

77
@ WinstonEwert: Por supuesto que vale la pena. Las personas especifican qué versión de API quieren usar, luego su programa no se quema espontáneamente en el tiempo entre que actualizas tu API y ellos actualizan su programa. Si no hace esto, automáticamente cambia cada versión actual e histórica del código de sus clientes cuando cambia su interfaz. Y esa es una forma terrible de ejecutar un servicio.
Lightness compite con Monica el

1
Este parece ser un muy buen punto: "Espero que en algunos casos las bibliotecas estrictas hayan anulado su comportamiento para manejar el tipo MIME incorrecto" Mi presentimiento (como respuesta a toda la pregunta) es que la gran mayoría de los clientes las bibliotecas estarán bien con esto, pero esto es una preocupación. Algunos clientes pueden haber trabajado proactivamente en torno a esto, y el intercambio lo romperá por ellos. Me pregunto cuánto de eso ha sucedido.
Harry Wood el

11

¿Esperaría que muchas bibliotecas de cliente HTTP diferentes arrojen errores fatales al ver tal cambio?

No. Cada biblioteca de cliente HTTP con la que estoy familiarizado ignorará el encabezado de tipo de contenido a menos que el programador lea específicamente ese encabezado y haga algo con él. Puedo imaginar una biblioteca donde el tipo de contenido: application / json automáticamente hace que se involucre un analizador json, pero no conozco ningún caso en el que eso realmente suceda.

La mayoría de las personas no parecen darse cuenta de que el tipo de contenido es incorrecto, pero de vez en cuando aparece una nueva solicitud de soporte quejándose de este problema, por lo que nos gustaría solucionarlo.

¿Cómo notaron el encabezado incorrecto? Podría valer la pena ver eso, porque si el encabezado incorrecto realmente les estaba causando problemas, claramente no lo estaban ignorando, y podrían tener problemas si se soluciona.



Si usa jQuery $.ajaxy no especifica la dataType:opción, infiere el tipo de respuesta del Content-typeencabezado. Entonces, si es así application/json, lo analizará automáticamente antes de pasarlo a la persona que llama.
Barmar

6

Demasiado difícil saberlo sin obtener la aprobación de todos sus clientes. Sugeriría tomar uno de los siguientes dos enfoques para actualizar su API a v.Next.

  1. Extienda la API existente. Agregue una cadena de consulta o alguna otra variable a su API que signifique usar v.Next. Para todas las solicitudes que usan esa variable, use el tipo de contenido actualizado.
  2. Ejecute una instancia provisional o de preproducción de su API en paralelo con su API actual. Debe ser casi idéntico a la producción. Incluso usando el mismo back-end. Aunque este tendrá los cambios propuestos para v.Next.

En cualquier caso, comunique a sus clientes los cambios que le gustaría hacer y la fecha / hora de corte objetivo. Aliéntelos a realizar una prueba mucho antes de la fecha objetivo para asegurarse de que no haya interrupción del servicio.

Asegúrese de tener una página dedicada que detalle los cambios realizados en v.Next. Esto debe incluirse en las comunicaciones enviadas a sus clientes. Si ha discutido alguna solución con los clientes existentes, inclúyala en esta página.

Finalmente, pise la línea entre comunicarse en exceso con sus clientes y enviarles correo no deseado. Estas notificaciones pueden pasarse por alto fácilmente a medida que surjan prioridades más inmediatas / urgentes.

FWIW, si las cosas funcionan actualmente, no me preocuparía demasiado por eso. Si, por ejemplo, encuentra que esto causa una vulnerabilidad de seguridad significativa, esa sería una gran razón para impulsar este cambio. De lo contrario, esperaría algo más urgente para incluir este cambio.


Gracias. No es la respuesta que quería escuchar, pero tal vez tengas razón. Solo necesitamos introducir el cambio con mucha cautela. ¿Pero es "demasiado difícil de decir"? Supongo que esperaba que algunas personas tuvieran experiencia del probable impacto de este tipo particular de cambio de encabezado de tipo de contenido (dejando de lado los puntos más genéricos sobre el control de versiones con cautela)
Harry Wood

5

Aquí hay un ejemplo de una biblioteca (bueno, comando único) que esto rompería:

El cmdlet Invoke-RestMethod actúa de manera diferente con JSON. Si el resultado de la solicitud es JSON, XML o ATOM / RSS (y creo que se basa en el encabezado), lo analiza / deserializa y devuelve objetos nativos; de lo contrario, devuelve los datos sin procesar.

Por lo tanto, el código existente se escribiría para tratar con una cadena (tal vez pasándolo a ConvertFrom-Json), y de repente comenzaría a fallar.


blogs.technet.microsoft.com/heyscriptingguy/2013/10/21/… confirma la teoría de que esto se ve en el encabezado.
Winston Ewert

-2

He notado dos consecuencias:

  1. Algunas bibliotecas de clientes no procesarán la respuesta correctamente. Por ejemplo, la respuesta devuelve una cadena en lugar de json o una matriz.
  2. La compresión no siempre se aplica.

Seguramente es el que envía los datos, no el que los recibe, ¿qué aplica la compresión?
TRiG
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.