Українська

Розробники · Base64 енкодер & decoder

Бази64 в JSON APIs: чому бінарні поля зашифровані і які витрати ви

· Чому це питання

Опубліковано ToolAcre · Редакція журналу

бази64 коди

Р JSON поле, що містить довгий рядок Base64, що представляє бінарні дані, закодовані для транспорту
Головна ToolAcre векторна ілюстрація

JSON не має байтного типу, тому бінарні дані зазвичай Base64-encoded в рядок. Цей пост пояснює, чому існує конвенція, що він коштує за розмірами і CPU, і коли окрема бінарна кінцева точка є кращим викликом.

Про нас PDF поле, що переважають відповідь — бетон API перезавантажити, де один Base64 розмитий зважився все інше

Анжела API відповідь містить великий об'єкт з одним полем, який домінує розмір навантаження. Відповідність JSON, так що кожне значення є рядок або номер. Більшість полів невеликими: ідентифікатори користувачів, своєчасність, коди статусу. Одне поле містить зображенняData або файлContents і є зображенням 40-kilobyte Base64 string. Весь відгук 50 кілограми. Що для одного облікового запису поля 80 відсотків переказу, що здається відпрацьованим, оскільки сервер відправив його як байти спочатку і клієнт потребує байтів знову в кінцевому підсумку.

Основна проблема: JSON не має рідного типу, тому бінарні дані необхідно загорнути в рядок. Base64 перетворює довільні байти в ASCII символи, які безпечні JSON. Як клієнт, так і сервер повинен зашифрувати код на отримання, додавши CPU руді. Отримане навантаження на третину більше, ніж сирі байти. Цей пост пояснює, чому існує конвенція, що це коштує на практиці, і при розірванні JSON обмеження з окремою бінарною кінцевою точкою варто.

Чому JSON не може носити сирі байти — рядки повинні бути дійсними у Unicode текст, тому довільні байти потребують текстового обгортання

JSON є текстовим форматом, де всі значення повинні бути дійсними у форматі Unicode. Специфікація визначає рядки, цифри, болеани та null. Не має байтного масиву або буферного типу. Якщо API необхідно повернути бінарні дані, як зображення, криптографічний підпис або завантаження файлів, не можна ставити сирі байти в JSON об'єкт безпосередньо. У байтах можуть містити символи, які JSON Крісти інтерпретують як структурні маркери. У середині бінарного бюба може припинити рядок рано або розбити парсер.

Загальний розчин є кодування бінарних даних як Base64, що виробляє рядок ASCII символи JSON Парсери лікують як звичайний текст. При отриманні клієнту після чого відхиляє Баз64 назад до байтів і використовує їх. Цей крок кодування відбувається на API рівень, прихований від більшості розробників, але це реальна вартість, яка накопичується при поверненні API багато бінарних полів. Вартість бази64 в JSON з'єднання по циклу запиту. Розмір штрафу - перша: Базова64 вихід приблизно 33 відсотків більше, ніж його вхід через кодування накладної.

Вартість: третій більше байтів, декодування часу та копій пам'яті — де кожна вартість з’являється у типовому клієнту

Р 30-megabyte відео файл стає 40 мегабайти при Base64-encoded. Завантаження 40 замість 30 Мегабайтні витрати на пропускну здатність і акумулятор на мобільних пристроях, і час для користувачів на повільних з'єднаннях. Друга вартість CPU час. Сервер повинен зашифрувати бінарні дані як Base64, перш ніж він може бути натягнутий в JSON. Клієнт повинен записати клієнт JSON а потім декодувати кожне поле Base64 назад до байтів. Для відповіді з декількома бінарними полями або клієнтом, який обробляє тисячі відповідей, що CPU час накопичується.

На обмежених пристроях, як телефони, JavaScript string Operations and TextDecoder, що використовується для базової 64 декодування споживаної батареї та уповільнення програми. Третя вартість пам'яті: JSON Парсер створює рядок для поля Base64, після чого декодування створює ще одну копію як Uint8Array. Велике поле миттєво впишеться двічі на пам'ять перед застосуванням. На прикладі роботи уточнюється вартість. Припустимо API endpoint повертає дані профілю користувача, включаючи 100-kilobyte avatar зображення. Сервер зчитуває зображення з диска як байтів, зашифрує його в Base64, і включає його в JSON відповідь.

Розроблений приклад: огляд поля Base64 від API відповідь — декодування його в браузері для підтвердження того, що сервер фактично відправлений

Про нас JSON відповідь зараз про 135 кілобайти33% накладний плюс інші поля. Завантаження клієнтів 135 кілограми замість 100. У браузері JSON парсер створює JavaScript string об'єкт для бази64 даних.

Коли програма потребує зображення, він викликає Base64 декодер, який створює Uint8Array оригінальний 100 кілограми. Для деяких мілісекундів декодування, обидва об'єкти існують в пам'яті. Якщо сторінка відображає десять профілів з аватарами, вартість багатопліфікована. Альтернатива для API повернути JSON відповідь з окремим URL для кожного аватарного ресурсу, дозволяючи браузеру обробляти завантаження зображень з рідним кешуванням, прогресивним рендерингом та управління пам'яттю.

Альтернативи: багаточасткові, роздільні URL-адреси завантаження та сирі бінарні кінцеві точки — торгові точки кожного

Відправлення між двома бінарними в JSON і свербіж його окремо залежить від API призначення та використання шаблонів. Для сторінки результатів пошуку, яка повертає сотні мініатюрних мініатюрних зображень, що обертаються кожен як окремий запит перемог HTTP з'єднання басейнів і кешування. Увімкнення їх як Base64 в JSON відповідь може бути швидше. Для докладної сторінки профілю, яка вимагає одного або двох зображень високої роздільної здатності, роздільні завантаження, явно краще. API документація повинна мати максимальний розмір поля Base64 і коли клієнт повинен очікувати окремих кінцевих точок.

Якщо поле регулярно перевищує кілобит або два, стратегія inline-Base64 є ознакою того, що поле постійно перевищує кілобит або два, інтлайн-Base64 є ознакою того, що API дизайн потребує реконтенції. Альтернативи Base64 в JSON існують, але кожен має торгові марки. Багатоквартирний MIME Відповідає окремий бінарний і текст, так що бінарний розділ надіслав як сирі байти і тільки текстовий розділ JSON. Це вимагає того, щоб клієнт записати багатостороннє повідомлення замість простого виклику JSON.parse, додаючи складність. Окреме завантаження URL в JSON Відповідні пункти клієнта, щоб кинути бінарний ресурс окремо.

Конвенції, які варто звернути увагу на вашу увагу API docs — стандартний універсальний базовий64url алфавіт, наповнювач і максимальні розміри

Це добре працює, коли бінарний ресурс є великим або доступним менш часто, ніж метадані. Сира бінарна кінцева точка, яка повертає тільки байти і відмовляється JSON повністю простий підхід, але видаляє структуру, яка JSON Послуги Деякі API повернути компресовані бінарні дані та Base64-encode, що, зменшуючи розмір штрафу, але додаючи декомпресію накладної. Вибір залежить від очікуваного використання: невеликі поля тонкі, великі поля відносяться до окремих ресурсів, і структуровані дані варто зберігати в JSON навіть з базовою вартістю.

Конвенції для взаємодійності. APIs, які Base64-encode бінарні дані повинні документувати його чітко і стан, чи є алфавіт стандартний або URL-безпечний. Стандарт Баз64 використовує + і /, які є безпечними JSON рядки, але не в URL. URL-safe Base64 замінює їх з - і , яка підходить для даних: URIs але необов'язково втекти в JSON. Документація повинна вказати, чи входить на нього наповнювач або вдається, тому що обидва дійсні Base64, але клієнт, який очікує на оббивання і отримує неоподані дані, не мовчить або виготовить сміття.

Що це не кришка — протобуф, CBOR та інші формати бінарних послідовностей

Для дуже великих або поширених полів, документування окремої бінарної кінцевої точки є важливим, тому клієнти не намагаються викопувати кілограми непотрібних даних. Відхилити API з базою64 полів прямопередня з правим інструментом. Base64 енкодер & decoder дозволяє видалити будь-яке поле локально в браузері, не зберігаючи його або відправляючи його в будь-який час. Скопіювати поле Base64 від JSON відповідь, вставте його в декодер і натисніть Decode. Для текстових данихJSON всередині бази64, наприклад, декодований вихід з’являється миттєво.

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

Приймальня: Base64 в JSON є компромісом, тому документ його — як Base64 енкодер & decoder допомагає вам перевіряти та перевіряти зашифровані поля локально

Практичний підхід до бази64 в API-інтерфейсах, а не уникнення. Base64 є стандартним способом носити бінарні дані в JSON і працює. Витримуєте, що кожен базовий поле займає третину більше за розміром і декількома мілісекундами CPU час за циклом запиту. Для малих критичних метаданих, таких як аутентифікаційні токени JWT собі Base64-encoded, вартість договірна. Для великих вкладеннях питання, чи повинен вінець подорожувати в одному відповідь або як окремий ресурс.

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