Каков правильный тип контента JSON?
Я некоторое время возился с JSON, просто выдвигал его в виде текста, и это никому не повредило (насколько я знаю), но я хотел бы начать делать все правильно.
Я видел так много предполагаемых "стандартов" для типа контента JSON:
application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json
Но какой из них правильный или лучший? Я понимаю, что между ними существуют проблемы с безопасностью и поддержкой браузера.
Я знаю там похожий вопрос: какой тип MIME, если JSON возвращается REST API? , но я бы хотел более точный ответ.
Ответы
Ответ 1
Для текста JSON:
application/json
Тип мультимедиа MIME для текста JSON - это application/json
. Кодировка по умолчанию - UTF-8. (Источник: RFC 4627).
Для JSONP (исполняемый JavaScript) с обратным вызовом:
application/javascript
Вот некоторые сообщения в блоге, которые были упомянуты в комментариях, которые имеют отношение к делу.
Ответ 2
IANA зарегистрировал официальный MIME-тип для JSON как application/json
.
Когда его спросили о том, почему не text/json
, Крокфорд, похоже, сказал, что JSON на самом деле не JavaScript, а текст, а IANA скорее всего передаст application/*
, чем text/*
.
Дополнительные ресурсы:
Ответ 3
Для JSON:
Content-Type: application/json
Для JSON-P:
Content-Type: application/javascript
Ответ 4
Конечно, правильный тип 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");
}
});
В случае использования типа ответа 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);
}
};
Ответ 5
JSON:
Ответ - это динамически генерируемые данные в соответствии с параметрами запроса, переданными в URL.
Пример:
{ "Name": "Foo", "Id": 1234, "Rank": 7 }
Content-Type: application/json
JSON-P:
JSON с отступом.
Ответ - это данные JSON, с обходом вокруг него вызова функции.
Пример:
functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});
Content-Type: application/javascript
Ответ 6
Если вы используете Ubuntu или Debian, и вы обслуживаете файлы .json через Apache, вы можете использовать файлы с правильным типом контента. Я делаю это прежде всего потому, что хочу использовать расширение Firefox JSONView
Модуль Apache mod_mime поможет сделать это легко. Однако с Ubuntu вам нужно отредактировать файл /etc/mime.types и добавить строку
application/json json
Затем перезапустите Apache:
sudo service apache2 restart
Ответ 7
Если вы вызываете веб-службы ASP.NET с клиентской стороны, вам нужно использовать application/json
, чтобы она работала. Я считаю, что это то же самое для jQuery и Ext.
Ответ 8
Правильный тип контента для JSON application/json
Если вы используете JSONP, также известный как JSON с Padding, который на самом деле является JavaScript, и поэтому правильный тип содержимого был бы application/javascript
.
Ответ 9
Нет сомнений в том, что 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.
Ответ 10
Только при использовании application/json
в качестве MIME у меня есть следующее (с ноября 2011 года с последними версиями Chrome, Firefox с Firebug):
- Больше никаких предупреждений от Chrome при загрузке JSON с сервера.
- Firebug добавит вкладку в ответ, показывающий вам данные JSON
отформатирована. Если тип MIME отличается, он будет отображаться как
"Содержимое ответа".
Ответ 11
Не все работает для типа контента application/json
.
Если вы используете Ext JS для отправки файла, имейте в виду, что ответ сервера анализируется браузером для создания документа для <iframe>
.
Если сервер использует JSON для отправки возвращаемого объекта, то заголовок Content-Type
должен быть установлен в text/html
, чтобы сообщить браузеру вставить текст без изменений в тело документа.
См. документацию API Ext JS 3.4.0.
Ответ 12
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!
Ответ 13
Если вы находитесь в среде на стороне клиента, исследование для поддержки кросс-браузера является обязательным для хорошо поддерживаемого веб-приложения.
Правильный HTTP Content-Type будет application/json
, поскольку другие уже выделены тоже, но некоторые клиенты не справляются с этим очень хорошо, поэтому jQuery рекомендует использовать по умолчанию text/html
.
Ответ 14
Правильный ответ:
Content-Type: application/json
Ответ 15
Как и многие другие, 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
получил официальную регистрацию.
В целом, всякий раз, когда у вас возникают сомнения в отношении типов контента, вы должны проверить эту ссылку
Ответ 16
В JSP вы можете использовать это в директиве страницы:
<%@ page language="java" contentType="application/json; charset=UTF-8"
pageEncoding="UTF-8"%>
Правильный тип MIME для JSON - application/json
. JSP будет использовать его для отправки ответа клиенту.
Ответ 17
"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())
}
}
Ответ 18
Регистрация IANA для application/json
говорит
Приложения, использующие этот тип носителя: JSON использовался для обмена данными между приложениями, написанными на всех этих языках программирования: ActionScript, 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
Ответ 19
Правильный тип MIME application/json
НО
Я испытал много ситуаций, когда нужен тип браузера или пользователь фреймворка:
text/html
application/javascript
Ответ 20
Я использую ниже
contentType: 'application/json',
data: JSON.stringify(SendData),
Ответ 21
Заголовок заголовка 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");
Ответ 22
В Spring у вас есть определенный тип: MediaType.APPLICATION_JSON_VALUE
, который эквивалентен application/json.
Ответ 23
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"));
Ответ 24
Если JSON с заполнением, то это будет application/jsonp
. Если JSON не имеет дополнения, то это будет application/json
.
Чтобы справиться с ними, рекомендуется использовать: "application/javascript", не беспокоясь о том, есть ли это с заполнением или без заполнения.
Ответ 25
Для JSON я использую:
Content-Type: application/json
Это описано в предложении IETF JSON Data Interchange Format 7158, Раздел 1.2: Спецификации JSON.
Ответ 26
Расширение принятых ответов, когда вы используете JSON в контексте REST...
Существует сильный сильный аргумент об использовании application/x-resource+json
и application/x-collection+json
, когда вы представляете ресурсы и коллекции REST.
И если вы решите следовать спецификации jsonapi, вы должны использовать application/vnd.api+json
, как это документировано.
Хотя нет универсального стандарта, ясно, что добавленная семантика передаваемых ресурсов оправдывает более явный Content-Type, чем просто application/json
.
Следуя этим соображениям, другие контексты могли бы оправдать более конкретный Content-Type.
Ответ 27
Разработчики PHP используют это:
<?php
header("Content-type: application/json");
// Do something here...
?>
Ответ 28
Если вы получаете данные из 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
Ответ 29
Форматы 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. Однако во многих случаях MIME-тип text/javascript
будет работать нормально.
Обратите внимание, что text/javascript
был помечен как устаревший в документе RFC 4329 (Scripting Media Types), и вместо него рекомендуется использовать тип application/javascript
. Однако из-за устаревших причин text/javascript
по-прежнему широко используется и имеет межбраузерную поддержку (что не всегда имеет место с типом MIME application/javascript
, особенно в старых браузерах).
Ответ 30
Content-Type: application/json
- JSON
Content-Type: application/javascript
- json-P
Content-Type: application/x-javascript
- javascript
Content-Type: text/javascript
- javascript, НО устаревшие, более старые версии IE, используемые для использования в качестве атрибута html.
Content-Type: text/x-javascript
- Типы мультимедиа JavaScript НО устарели
Content-Type: text/x-json
- json до официальной регистрации приложения /json.