Питання Який правильний тип вмісту JSON?


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

я бачив так багато передбачуваних "стандартів" для типу контенту JSON:

application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json

Але що правильно, або краще? Я збираюся, що існують різноманітні проблеми з безпекою та підтримкою браузера.

Я знаю, що є аналогічне питання Який тип MIME, якщо JSON повертається REST API?, але я хотів би трохи більш цільової відповіді.


9201
2018-01-25 15:25


походження




Відповіді:


Для тексту JSON:

application/json

Тип носія MIME для тексту JSON application/json. Типовим кодуванням є UTF-8. (Джерело: RFC 4627)

Для JSONP (runnable javascript) з зворотним дзвінком:

application/javascript

Ось деякі публікації в блозі, які були згадані у відповідних коментарях.


9176
2018-01-25 15:27



Повний список типів MIME - Eugen Mihailescu
Чи можу я надіслати файл разом із текстом Джонса? - OPV
чи дійсно важливо, який тип MIME має? це текст, який розбирається в об'єкті. чи не було б більш природним передавати його як текст / простий, якщо ви хочете, щоб його було відкрито в браузері без завантаження сили, а також прикладного / октетового потоку, якщо ви хочете, щоб його автоматично завантажували (корисно, якщо ви його генеруєте веб-сторінка, призначена для збереження на місці). Чи дійсно багато людей, яким доведеться знати тип MIME, так що завантажувач може переглядати його за допомогою спеціального переглядача json? Що мені не вистачає, що вимагає спеціального типу MIME? - Dmitry
Використання "text / plain" є загалом поганою практикою. Є, наприклад, атаки на веб-платформі, які б дозволяли крадіжці даних про перехресне походження, якщо ви не змогли відправити відповідне значення типу MIME. - EricLaw
У Internet Explorer іноді виникають проблеми з програмою / json - блог знаходиться поза мережею - codetoshare


IANA зареєстрував офіційний тип MIME для JSON як application/json.

На питання про чому немає text/json, Крокфорд, схоже, сказав, що JSON - це не JavaScript, а текст, а також IANA, швидше за все, роздавати application/* ніж text/*.

Більше ресурсів:


1473
2018-04-07 04:32



Дуже багато чого потрапило в text/* розділ в перші дні, які, ймовірно, будуть введені в application/* секція в ці дні. - TRiG
І це велика помилка імхо. JSON - це текст. Може бути прочитаний / написаний будь-яким текстовим редактором. Це важливо знати, але не може бути похідним від нього application/json. Я думаю, було б здорово мати все, що можна відкрити за допомогою текстового редактора під text, специфічні doctypes XML внизу text/xml/xhtml тощо ... Це справді допомогло б організувати. - Stijn de Witt
Я можу відкрити a .jpg в моєму текстовому редакторі. - Rohmer
@Rohmer - Ви можете "відкрити" щось у текстовому редакторі, але бінарний формат JPEG або Windows .exe або .zip міститиме невидавані символи, які можуть фактично порушити багато текстових редакторів або викликати небажану поведінку. Спробуйте запустити cat file.jpg наприклад. У той час як будь-який файл xml або json є 100% друкованим. Тому я думаю, що справа Стиуна де Вітта є дійсною, незважаючи на те, що так, вже пізно змінити зараз. - XP84
@ XP84 Ви можете відкрити будь-який бінарний файл із текстовим редактором у форматі HEX. І всі різні символи (з них 16) 100% друкуються. Отже, за цією логікою ... Чи є всі тексти в форматі binaries?  Джонс - це не текст. Йонс є (попередження: неформальне вільне визначення вперед) текстове представлення об'єкта (або масиву об'єктів) - xDaizu


Для JSON:

Content-Type: application/json

Для JSON-P:

Content-Type: application/javascript

786
2018-06-20 03:10



Хоча JSONP насправді не є JSON, це техніка для передачі буквального об'єкта JavaScript - Benjamin Gruenbaum


Звичайно, правильний тип носія MIME для JSON - це application/json, але необхідно усвідомити, які типи даних очікуються у вашій заявці.

Наприклад, я використовую Ext GWT і відповідь сервера повинна йти як text / html але містить дані JSON.

Клієнт, Ext GWT форма слухача

uploadForm.getForm().addListener(new FormListenerAdapter()
{
    @Override
    public void onActionFailed(Form form, int httpStatus, String responseText) 
    {
        MessageBox.alert("Error");
    }

    @Override
    public void onActionComplete(Form form, int httpStatus, String responseText) 
    {
        MessageBox.alert("Success");
    }
});

У разі використання додаток / json Тип відповіді, браузер пропонує мені зберегти файл.

Фрагмент вихідного коду на стороні сервера, використовуючи Весна MVC

return new AbstractUrlBasedView() 
{
    @SuppressWarnings("unchecked")
    @Override
    protected void renderMergedOutputModel(Map model, HttpServletRequest request,
                                           HttpServletResponse response) throws Exception 
    {
        response.setContentType("text/html");
        response.getWriter().write(json);
    }
};

584
2017-10-07 14:35



Відповідь сервера повинна йти як текст / html. Це справедливо і для варіанта ExtJS. - gbegley


JSON:

Відповідь - дані, що генеруються динамічно, відповідно до параметрів запиту, що передаються в URL-адресі.

Приклад:

{ "Name": "Foo", "Id": 1234, "Rank": 7 }

Тип контенту:  application/json


JSON-P:

JSON з прокладкою. Відповідь - це дані JSON, з викликом функції, що обертається навколо нього.

Приклад:

functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});

Тип контенту:  application/javascript


427
2018-03-28 07:54



Як у нього менше голосів, ніж наведена вище відповідь, вона більш повна та містить визначення. - Daniel Waters
@DanielWaters Визначення JSON неправильне. Не потрібно генерувати динамічно або поважати параметри запиту. Ви можете обслуговувати статичний файл JSON. Крім того, найбільш очікувана відповідь має посилання на RFC. - styfle
Також JSONP може бути дані json, присвоєні var. - Jimmy Kane


Якщо ви використовуєте Ubuntu або Debian, і ви служите .json файли через Apache, ви можете подати файли з правильним типом вмісту. Я роблю це в першу чергу через те, що хочу використовувати розширення Firefox JSONView

Модуль Apache mod_mime допоможе легко зробити це. Однак, з Ubuntu потрібно редагувати файл /etc/mime.types і додати рядок

application/json json

Потім перезапустіть Apache:

sudo service apache2 restart

372
2017-11-16 22:58



зазвичай достатньо перезавантаження (швидше, ніж перезавантаження). Також зауважте, що тепер ви можете зробити "судо служби apache2 перезавантажити". - noamtm
Ubuntu 12.04 має це за замовчуванням - Prizoff


Якщо ви кличуєте веб-служби ASP.NET з клієнтської сторони, ви повинні використовувати його application/json для того, щоб працювати. Я вважаю, що це те ж саме для jQuery і Ext рамки


361
2018-01-25 15:31



JQuery, здається, працює з принаймні "application / json" та "text / plain" ... Я не пробував усіх інших, хоча. - Nathan
jQuery здатний працювати з content-Type: text/plain, content-Type: application/json, content-Type: application/json; charset=UTF-8, contentType: "application/x-www-form-urlencoded; charset=UTF-8" - Ashraf.Shk786


Правильний тип вмісту для JSON - це application/jsonЯКЩО ви не використовуєте JSONP, також відомий як JSON з підкладкою, що насправді є JavaScript, і таким чином буде правильний тип вмісту application/javascript.


287
2018-04-12 04:00





Немає сумніву, що application/json найкращий MIME введіть відповідь JSON.

Але я мав певний досвід, де мені доводилося користуватися application/x-javascript через деякі проблеми стиснення. Моє середовище хостингу - це загальний хостинг з GoDaddy. Вони не дозволяють мені змінювати конфігурації серверів. Я додав наступний код до мого web.config файл для стиснення відповідей.

<httpCompression>
    <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
    <dynamicTypes>
        <add mimeType="text/*" enabled="true"/>
        <add mimeType="message/*" enabled="true"/>
        <add mimeType="application/javascript" enabled="true"/>
        <add mimeType="*/*" enabled="false"/>
    </dynamicTypes>
    <staticTypes>
        <add mimeType="text/*" enabled="true"/>
        <add mimeType="message/*" enabled="true"/>
        <add mimeType="application/javascript" enabled="true"/>
        <add mimeType="*/*" enabled="false"/>
    </staticTypes>
</httpCompression>
<urlCompression doStaticCompression="true" doDynamicCompression="true"/>

Використовуючи це, сторінки .aspx було стиснено за допомогою g-zip, проте відповіді JSON не було. я додав

<add mimeType="application/json" enabled="true"/>

в статичних та динамічних розділах типів. Але це взагалі не стискає JSON-відповідей.

Після цього я видалив цей доданий тип і додав

<add mimeType="application/x-javascript" enabled="true"/>

як в статичних, так і в динамічних розділах типів, і змінив тип відповіді в

.ashx (асинхронний обробник) до

application/x-javascript

І тепер я виявив, що мої відповіді JSON були стиснуті g-zip. Тому я особисто рекомендую використовувати

application/x-javascript

лише якщо ви хочете стискати свої відповіді JSON на a середовище спільного хостингу. Оскільки у загальному хостінгу вони не дозволяють вам змінюватися IIS конфігурації


277
2018-04-18 08:22



"Тому я особисто рекомендую використовувати програму / x-javascript", де ця відповідь стає помилкою. GoDaddy робить дозволити стиснення application/json, Я використовую його на своєму загальному хостингу, і я б не рекомендував використовувати інший тип вмісту, щоб у будь-якому разі включити стиснення, це просто неправильно. Це можна зробити, але це все одно буде неправильним. Використовуйте різні типи вмісту для Підтримка браузера є одне, використання інших типів вмісту для стиснення на стороні сервера - інше. - Lady Bird


Тільки при використанні application/json як MIME тип I має наступне (станом на листопад 2011 року з найновішими версіями Chrome, Firefox з Firebug):

  • Немає більше попереджень від Chrome, коли JSON завантажується з сервера.
  • Firebug додасть вкладку до відповіді, яка покаже вам дані JSON відформатований Якщо тип MIME відрізняється, він буде відображатися як "Відповідний вміст".

252
2017-11-30 06:42





Не все працює для типу вмісту application/json.

Якщо ви використовуєте Ext JS Форма submit для завантаження файлу, майте на увазі, що відповідь сервера аналізується браузером, щоб створити документ для <iframe>.

Якщо сервер використовує JSON для надсилання об'єкта повернення, то Content-Type заголовок повинен бути встановлений на text/html щоб повідомити браузеру вставити текст без змін до тіла документа.

Побачити документація API Ext JS 3.4.0.


229
2017-09-07 02:41



Інструменти, які не дотримуються стандартів, слід уникати, коли це можливо; використовувати application/json за спец. - one.beat.consumer
@ one.beat.consumer, в той час як це правда, воно не є специфічним для ExtJs per se. Це обмеження браузера (вірніше, можливо, "заходи безпеки"). - Hendy Irawan
Звичайно, було б краще використовувати текст / простий, щоб він не застосовував жодної HTML-семантики до не-HTML-контенту? Чи не дозволяють браузери витягувати вміст фрейму, якщо він не має DOM? - Synchro
Щоб додати додаткову плутанину: я просто налагоджую подібний випадок на Samsung Galaxy Beam (Android 2.3) за допомогою браузера за умовчанням, а iframe Здається, вогнем load подія для application/javascript, application/x-javascript, text/javascript, text/plain, але НЕ стріляючи за application/json ні text/html. На сьогодні Android <= 2.3 становить близько 50% частки ринку Android. - jakub.g