Каков правильный тип содержимого JSON?
Я некоторое время возился с JSON, просто выдвигал его в виде текста, и это никому не повредило (насколько я знаю), но я хотел бы начать делать все правильно.
Я видел так много предполагаемых "стандартов" для типа контента JSON:
application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json
Но что является правильным или лучшим? Я понимаю, что между ними существуют проблемы с безопасностью и поддержкой браузера.
Я знаю, что есть похожий вопрос: какой тип MIME, если JSON возвращается REST API?, но я бы хотел более точный ответ.
45 ответов
Для текста JSON:
application/json
Тип носителя MIME для текста JSON:
application/json
, Кодировка по умолчанию - UTF-8. (Источник: RFC 4627).
Для JSONP (исполняемый JavaScript) с обратным вызовом:
application/javascript
Вот некоторые сообщения в блоге, которые были упомянуты в комментариях, которые имеют отношение к делу.
- Почему вы не должны использовать
text/html
для JSON - Internet Explorer иногда имеет проблемы с
application/json
(DEAD 2018-06-26) - Довольно полный список Mimetypes и что их использовать для
- Официальный список типов пантомимы в IANA из ответа @nnffan ниже
IANA зарегистрировала официальный тип MIME для JSON как application/json
,
Когда спрашивают о том, почему нет text/json
Крокфорд, похоже, сказал, что JSON на самом деле не JavaScript и не текст, а также IANA с большей вероятностью раздаст application/*
чем text/*
,
Больше ресурсов:
Конечно, правильный тип мультимедиа MIME для JSON application/json
, но необходимо понимать, какой тип данных ожидается в вашем приложении.
Например, я использую Ext GWT, и ответ сервера должен идти как text/html, но содержит данные JSON.
Клиентская сторона, прослушиватель Ext GWT form
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");
}
});
В случае использования типа ответа application/json браузер предлагает мне сохранить файл.
Фрагмент исходного кода на стороне сервера с использованием Spring 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);
}
};
JSON:
Ответ - это динамически генерируемые данные в соответствии с параметрами запроса, переданными в URL.
Пример:
{ "Name": "Foo", "Id": 1234, "Rank": 7 }
Тип содержимого: application/json
JSON-P:
JSON с дополнением. Ответ - данные JSON, с обернутым вокруг него вызовом функции.
Пример:
functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});
Тип содержимого: application/javascript
Если вы используете Ubuntu или Debian и обслуживаете файлы.json через Apache, вы можете использовать файлы с правильным типом содержимого. Я делаю это прежде всего потому, что я хочу использовать расширение Firefox JSONView
Модуль Apache mod_mime поможет сделать это легко. Однако в Ubuntu вам нужно отредактировать файл /etc/mime.types и добавить строку
application/json json
Затем перезапустите Apache:
sudo service apache2 restart
Правильный тип контента для JSON application/json
ЕСЛИ вы не используете JSONP, также известный как JSON with Padding, который на самом деле является JavaScript и поэтому правильный тип контента будет application/javascript
,
Без сомнения 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 в среде общего хостинга. Потому что в виртуальном хостинге они не позволяют изменять конфигурации IIS.
Только при использовании application/json
как тип MIME у меня есть следующее (по состоянию на ноябрь 2011 года с самыми последними версиями Chrome, Firefox с Firebug):
- Больше нет предупреждений от Chrome при загрузке JSON с сервера.
- Firebug добавит вкладку в ответ, показывающую вам отформатированные данные JSON. Если тип MIME отличается, он будет отображаться как "содержимое ответа".
Не все работает для типа контента application/json
,
Если вы используете отправку формы Ext JS для загрузки файла, имейте в виду, что ответ сервера анализируется браузером для создания документа для <iframe>
,
Если сервер использует JSON для отправки возвращаемого объекта, то Content-Type
заголовок должен быть установлен в text/html
чтобы сказать браузеру вставить текст без изменений в тело документа.
JSON является предметно-ориентированным языком (DSL) и форматом данных, независимым от JavaScript, и поэтому имеет свой собственный тип MIME, application/json
, Уважение к MIME-типам, конечно же, зависит от клиента, поэтому text/plain
может сделать для передачи байтов, но тогда вы будете излишне толкать интерпретацию в домен приложения поставщика - application/json
, Вы бы передали XML через text/plain
?
Но, честно говоря, ваш выбор типа MIME - это совет клиенту о том, как интерпретировать данные. text/plain
или же text/HTML
(когда это не HTML) это как стирание типа - это так же неинформативно, как создание всех ваших объектов типа Object на типизированном языке.
Ни одна браузерная среда выполнения, о которой я знаю, не возьмет документ JSON и автоматически сделает его доступным для среды выполнения как доступный для JavaScript объект без вмешательства, но если вы работаете с искалеченным клиентом, это совсем другой вопрос. Но это еще не все: службы RESTful JSON часто не имеют времени выполнения JavaScript, но это не мешает им использовать JSON в качестве жизнеспособного формата обмена данными. Если клиенты настолько уродливы... тогда я мог бы рассмотреть возможность внедрения HTML через службу шаблонов Ajax.
Применение /JSON!
Если вы находитесь в клиентской среде, изучение поддержки кроссбраузерности обязательно для хорошо поддерживаемого веб-приложения.
Правильный тип содержимого HTTP будет application/json
, как уже отмечали другие, но некоторые клиенты не справляются с этим очень хорошо, поэтому jQuery рекомендует использовать по умолчанию text/html
,
Как многие другие упоминали, application/json
это правильный ответ.
Но что еще не было объяснено, так это то, что означают другие предложенные вами варианты.
application/x-javascript
: Экспериментальный MIME-тип для JavaScript передapplication/javascript
был сделан стандарт.text/javascript
Сейчас устарели. Вы должны использоватьapplication/javascript
при использовании JavaScript.text/x-javascript
: Экспериментальный тип MIME для вышеуказанной ситуации.text/x-json
: Экспериментальный MIME-тип для JSON передapplication/json
получил официальную регистрацию.
В общем, когда у вас есть какие-либо сомнения по поводу типов контента, вы должны проверить эту ссылку
"application/json
”Является правильным типом содержимого JSON.
def ajaxFindSystems = {
def result = Systems.list()
render(contentType:'application/json') {
results {
result.each{sys->
system(id:sys.id, name:sys.name)
}
}
resultset (rows:result.size())
}
}
Регистрация в IANA дляapplication/json
говорит
Приложения, использующие этот тип носителя: JSON использовался для обмена данными между приложениями, написанными на всех этих языках программирования: ActionScript, C, C#, Clojure, ColdFusion, Common Lisp, E, Erlang, Go, Java, JavaScript, Lua, Objective. CAML, Perl, PHP, Python, Rebol, Ruby, Scala и Scheme.
Вы заметите, что IANA.org не перечисляет ни один из этих других типов медиа, на самом деле даже application/javascript
сейчас устарел. Так application/json
действительно единственный возможный правильный ответ.
Поддержка браузера это другое дело.
Наиболее широко поддерживаемые нестандартные типы носителей text/json
или же text/javascript
, Но некоторые громкие имена даже используют text/plain
,
Еще более странным является заголовок Content-Type, отправленный Flickr, который возвращает JSON как text/xml
, Google использует text/javascript
для некоторых это ajax apis.
Примеры:
curl -I "https://ajax.googleapis.com/ajax/services/search/video?v=1.0&q=jsonexample"
Выход: Content-Type: text/javascript
curl -I "https://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=f82254c1491d894f1204d8408f645a93"
Выход: Content-Type: text/xml
Правильный тип MIME application/json
НО
Я сталкивался со многими ситуациями, когда требовался тип браузера или пользователь фреймворка:
text/html
application/javascript
Я использую ниже
contentType: 'application/json',
data: JSON.stringify(SendData),
Заголовок Content-Type должен быть установлен на "application/json" при публикации. Прослушивание запроса сервером должно включать "Accept = application/json". В Spring MVC вы можете сделать это так:
@RequestMapping(value="location", method = RequestMethod.POST, headers = "Accept=application/json")
Добавьте заголовки к ответу:
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
Content-type: application/json
- JSONContent-Type: application/javascript
- JSON-PContent-type: application/x-javascript
- JavaScriptContent-type: text/javascript
- JavaScript, НО устаревшие, более старые версии IE, используемые для использования в качестве атрибута HTML.Content-type: text/x-javascript
- JavaScript Media Types НО устарелContent-type: text/x-json
- JSON до применения / JSON получил официальную регистрацию.
application/json
отлично работает в PHP для хранения данных массива или объекта.
Я использую этот код для помещения данных в JSON в Google Cloud Storage (GCS), который доступен для общего просмотра:
$context = stream_context_create([
'gs' => [
'acl'=>'public-read',
'Content-Type' => 'application/json',
]
]);
file_put_contents(
"gs://BUCKETNAME/FILENAME.json",
json_encode((object) $array),
false,
$context
);
Чтобы вернуть данные прямо вперед:
$data = json_decode(file_get_contents("gs://BUCKETNAME/FILENAME.json"));
Весной у вас есть определенный тип: MediaType.APPLICATION_JSON_VALUE
что эквивалентно заявке / JSON.
Для JSON я использую:
Content-Type: application/json
Это описано в предложении IETF о формате обмена данными JSON 7158, раздел 1.2: спецификации JSON.
Если JSON с отступом, то это будет application/jsonp
, Если JSON без заполнения, то это будет application/json
,
Чтобы справиться с обоими, хорошей практикой является использование: application/javascript, не беспокоясь о том, идет ли это с заполнением или без заполнения.
Расширение принятых ответов, когда вы используете JSON в контексте REST...
Существует сильный аргумент об использовании application/x-resource+json
а также application/x-collection+json
когда вы представляете ресурсы и коллекции REST.
И если вы решите следовать спецификации jsonapi, вы должны использовать application/vnd.api+json
, как это задокументировано.
Хотя универсального стандарта не существует, ясно, что добавленная семантика к передаваемым ресурсам оправдывает более явный тип контента, чем просто application/json
,
Следуя этому рассуждению, другие контексты могут оправдать более конкретный Content-Type.
Если вы получаете данные из REST API в JSON, вам нужно использовать тип контента
For JSON data: Content-Type:application/json
For HTML data: Content-Type:text/html,
For XHTML data: Content-Type:application/xhtml+xml,
For XML data: Content-Type:text/xml, application/xml
PHP разработчики используют это:
<?php
header("Content-type: application/json");
// Do something here...
?>
Форматы JSON (JavaScript Object Notation) и JSONP ("JSON with padding") кажутся очень похожими, и поэтому может быть очень запутанным, какой тип MIME они должны использовать. Хотя форматы кажутся очень похожими, между ними есть некоторые тонкие различия.
Поэтому, когда бы ни возникали какие-либо сомнения, у меня есть очень простой подход (который в большинстве случаев отлично работает), а именно, пойти и проверить соответствующий документ RFC.
JSON RFC 4627 (Приложение / JSON Media Type для JavaScript Object Notation (JSON)) является спецификацией формата JSON. В разделе 6 говорится, что медиа-тип MIME для текста JSON
application/json.
JSONP JSONP ("JSON with padding") обрабатывается в браузере не так, как JSON. JSONP рассматривается как обычный сценарий JavaScript, поэтому для него следует использовать application/javascript,
текущий официальный тип MIME для JavaScript. Однако во многих случаях text/javascript
MIME-тип тоже будет работать нормально.
Обратите внимание, что text/javascript
был помечен как устаревший в документе RFC 4329 (Scripting Media Types), и его рекомендуется использовать application/javascript
введите вместо. Тем не менее, из-за наследства причин, text/javascript
по-прежнему широко используется и имеет поддержку кросс-браузер (что не всегда application/javascript
Тип MIME, особенно в старых браузерах).