Запускаючи API, якщо я виправляю заголовок типу вмісту, це порушить справи для клієнтів?


14

У нас працює API з ним досить мало людей. Через деяку незграбність з мого боку, одна з кінцевих точок повертає неправильний заголовок типу вмісту , jsколи це має бути json. Моє запитання полягає в тому, що якщо ми вирішимо це шляхом заміни, щоб повернути правильне значення, наскільки погано це може зіпсувати речі для наших існуючих клієнтів? Або, кажучи іншим чином, чи очікуєте, що багато різних бібліотек клієнтів HTTP видають фатальні помилки, побачивши таку зміну?

Ми намагаємось вирішити, чи це зміна, яку ми можемо просто зробити вперед і зробити це не надто потужно, або нам слід обережно надіслати електронною поштою всім користувачам і оголосити багаторічний термін депресії ... або щось середнє.

Це, мабуть, трохи залежить від того, які різні клієнти HTTP використовуються, тому я роздивився агентів користувачів. Відповідь: дуже багато різних! Ось кілька найкращих:

"okhttp / 3.2.0", "python-request / 2.10.0", "Ruby", "python-request / 2.7.0", "Mozilla / 5.0", "Java / 1.8.0_91", "python-request /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 "

Різні різні бібліотеки мовної та серверної мови. Здебільшого це не браузери, на яких працює JavaScript, але деякі з них теж.

Більшість людей, здається, не помічають, що тип вмісту невірний, але раз у раз з’являється новий запит на підтримку, який скаржиться на цю проблему, тому ми хотіли б це виправити.


4
Я б припустив, що клієнти, які працюють правильно з неправильним заголовком типу вмісту, не припинять працювати, коли ви встановите правильний, але ви знаєте, що вони говорять про припущення. Тому тестуйте, повідомте про свої зміни на базі користувачів заздалегідь та / або вбудуйте якусь додаткову логіку, що якщо певний клієнт порушиться, ви можете виявити цього конкретного клієнта і продовжувати повертати неправильний заголовок типу вмісту (або робити зворотний, повернути правильний для тих клієнтів, які генерують квитки на підтримку і зберігають все те саме для поточних користувачів / користувальницьких агентів).
HBruijn

5
обов'язковий xkcd: xkcd.com/1172
njzk2

Ви не оновлюєте свій API?
Майкл Хемптон

У нас є лише основний номер версії для всього API, який ми б хотіли зіткнутися лише через кілька років, коли ми зробимо деякі досить великі реструктуризації. Тоді ми б, звичайно, вирішили цю проблему, але ... відчуваємо, що ми ніколи цього не зробимо. Це один із таких номерів версій.
Гаррі Вуд

Відповіді:


30

як погано це може зіпсувати речі для наших існуючих клієнтів?

Він може повністю затопити їх лінійні кораблі, якщо вони написали код, який покладається на те, що цей Content-Type є невірним.

Я б не очікував, що бібліотеки можуть видаляти помилки, але я вважаю, що в деяких випадках суворі бібліотеки перекривали свою поведінку для обробки неправильного типу MIME.

Якщо ваш API має значення версії / редакції десь у полі запиту, підніміть його, а в новій версії поверніть правильний тип, але продовжуйте повертати неправильний тип у старих версіях. Якщо у вас немає такого запиту, зараз прийшов час додати його.


6
+1 вже за хорошу гіперболу
HBruijn

4
Часто у вас немає вибору. Клієнти, які отримали ультиматум "оновити або залишити", можуть вирішити останній, в принципі хороший, поганий на практиці. Стару версію можна з часом звільнити.
alzee

3
+1 для версія прохання, хоча ви можете перевірити en.wikipedia.org/wiki/Software_versioning для отримання додаткової інформації.
SBoss

7
@WinstonEwert: Звичайно, варто. Люди вказують, яку версію API вони хочуть використовувати, тоді їх програма не спалахує спонтанно за час між вами оновленням API та оновленням програми. Якщо цього не зробити, ви автоматично порушуєте кожен поточний та історичний випуск коду своїх клієнтів, коли ви змінюєте інтерфейс. І це жахливий спосіб запустити службу.
Гонки легкості з Монікою

1
Це здається дуже вдалим моментом: "Я очікую, що в деяких випадках суворі бібліотеки перестали поведінку, щоб обробити невірний тип mime". Моя думка (як відповідь на все питання) полягає в тому, що переважна більшість клієнтів бібліотеки з цим будуть добре, але це хвилює. Деякі клієнти, можливо, активно працювали над цим, і свопінг згодом це порушить. Цікаво, скільки цього трапилося.
Гаррі Вуд

11

Чи очікуєте ви, що багато різних бібліотек HTTP-клієнтів видаватимуть фатальні помилки, побачивши таку зміну?

Ні. Кожна бібліотека клієнтів HTTP, з якою я знайома, буде ігнорувати заголовок типу вмісту, якщо програміст спеціально не прочитає цей заголовок і щось з ним не зробить. Я можу уявити собі бібліотеку, в якій тип вмісту: application / json автоматично спричиняє участь аналізатора json, але я не знаю жодного випадку, коли це насправді відбувається.

Більшість людей, здається, не помічають, що тип вмісту невірний, але раз у раз з’являється новий запит на підтримку, який скаржиться на цю проблему, тому ми хотіли б це виправити.

Як вони помітили неправильний заголовок? Можливо, варто поглянути на це, адже якщо неправильний заголовок насправді спричиняє їм проблеми, вони, очевидно, не просто ігнорують його, і вони можуть мати проблеми, якщо це буде виправлено.



Якщо ви використовуєте jQuery $.ajaxі не вказуєте dataType:параметр, він визначає тип відповіді із Content-typeзаголовка. Тож якщо він є application/json, він автоматично розбере його, перш ніж передати його абоненту.
Бармар

6

Занадто важко сказати, не виходячи з усіх своїх клієнтів. Я б запропонував скористатися одним із наступних двох підходів, щоб оновити API до v.Next.

  1. Розширення існуючого API. Додайте рядок запиту або іншу змінну до свого API, що означає використовувати v.Next. Для всіх запитів, що використовують цю змінну, використовуйте оновлений тип вмісту.
  2. Запустіть поетапний або передвиробничий екземпляр свого API паралельно з вашим поточним API. Він повинен бути майже ідентичним виробництву. Навіть використовуючи той самий бек-енд. Хоча в цьому буде запропоновані зміни для v.Next.

За будь-якого сценарію повідомте своїм клієнтам про зміни, які ви хочете внести, та цільову дату / час перерізу. Запропонуйте їм протестувати заздалегідь перед цільовою датою, щоб упевнитись у порушенні обслуговування.

Переконайтеся, що у вас є спеціальна сторінка з детальними відомостями про зміни, внесені до v.Next. Це повинно бути включено в повідомлення, що надсилаються вашим клієнтам. Якщо ви обговорювали будь-які виправлення з існуючими клієнтами, включіть їх на цю сторінку.

Нарешті, ступіть межу між надмірно спілкуватися зі своїми клієнтами та спамом. Ці сповіщення можна легко помітити, коли з’являються більш негайні / нагальні пріоритети.

FWIW, якщо справи зараз працюють, я б не переживав над цим. Якщо, наприклад, ви виявите, що це спричиняє значну вразливість безпеки, то це буде чудовим приводом витіснити цю зміну. Інакше я зачекаю на щось більш актуальне, щоб включити цю зміну.


Спасибі. Це не відповідь, яку я хотів почути, але, можливо, ти маєш рацію. Нам просто потрібно ввести зміни дуже обережно. Хоча це "занадто важко сказати"? Я здогадуюсь, що я сподівався, що деякі люди матимуть досвід можливого впливу цієї конкретної зміни змісту заголовка типу вмісту (залишаючи осторонь більш загальні моменти щодо версії з обережністю)
Гаррі Вуд

5

Ось приклад бібліотеки (ну, одна команда), що це порушить:

Командлети Invoke-RestMethodдіє по- різному з JSON. Якщо результатом запиту є JSON, XML або ATOM / RSS (і я думаю, що це базується на заголовку), він аналізує / десериалізує його та повертає рідні об'єкти, інакше повертає необроблені дані.

Таким чином, існуючий код буде написаний для обробки рядка (можливо, передавши його в ConvertFrom-Json), і раптом почав би виходити з ладу.


blogs.technet.microsoft.com/heyscriptingguy/2013/10/21/… підтверджує теорію, що це дивиться на заголовок.
Вінстон Еверт

-2

Я помітив два наслідки:

  1. Деякі бібліотеки клієнтів не будуть обробляти відповідь належним чином. Наприклад, відповідь повертає рядок замість json або масиву.
  2. Стиснення застосовується не завжди.

Напевно, саме той, хто надсилає дані, а не той, хто їх отримує, застосовує стиснення?
TRiG
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.