Каков правильный тип контента JSON?
я возился с JSON в течение некоторого времени, просто выталкивая его как текст, и это никому не повредило (что я знаю), но я хотел бы начать делать все правильно.
Я видел так многие предполагаемые "стандарты" для типа контента JSON:
application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json
но что правильно или лучше? Я понимаю, что между ними существуют проблемы безопасности и поддержки браузера.
Я знаю, что есть подобный вопрос, какой тип MIME, если JSON возвращается API REST?, но я хотел бы немного более целенаправленный ответ.
30 ответов
для текста JSON:
application/json
тип носителя MIME для текста JSON -
application/json
. Кодировка по умолчанию-UTF-8. (Источник: RFC 4627).
на JSONP (запускаемый javascript) с обратным вызовом:
application/javascript
вот некоторые сообщения в блоге, которые были упомянуты в комментариях, которые соответствующий.
в IANA зарегистрировал официальный тип MIME для JSON как application/json
.
когда его спросили, почему бы и нет text/json
, Крокфорд, кажется, сказал, что JSON на самом деле не JavaScript и не текст, а также IANA, скорее всего, раздаст application/*
чем text/*
.
больше ресурсов:
конечно, правильный тип носителя MIME для JSON -application/json
, но необходимо понять, какой тип данных ожидается в вашем приложении.
например, я использую Ext GWT и ответ сервера должен идти как text / html но содержит данные JSON.
клиентская сторона, Ext GWT form listener
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 тип ответа, браузер предлагает мне сохранить файл.
фрагмент исходного кода на стороне сервера с помощью Весна 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.типы и добавить строку
application/json json
затем перезапустите Apache:
sudo service apache2 restart
правильный тип контента для JSON -application/json
Если вы не используете JSONP, также известный как JSON с заполнением, который на самом деле JavaScript и поэтому правильный тип контента будет application/javascript
.
нет никаких сомнений в том, что application/json
лучший МИМ введите ответ 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"/>
используя это, the .страницы aspx были сжаты с помощью g-zip, но ответы JSON не были. Я добавил
<add mimeType="application/json" enabled="true"/>
в разделах статический и динамический типы. но это не сжимает ответы JSON вообще.
после этого я удалил этот добавленный тип и добавил
<add mimeType="application/x-javascript" enabled="true"/>
в разделах статического и динамического типов, а также изменил тип ответа в
.данного (асинхронный обработчик) в
application/x-javascript
и теперь я обнаружил, что мои ответы JSON были сжаты с г-молнии. Поэтому я лично рекомендую использовать
application/x-javascript
только если вы хотите сжать свои ответы JSON на хостинга окружающей среды. Потому что в shared hosting они не позволяют вам изменять IIS конфигурации.
только при использовании application/json
Как МИМ тип у меня есть следующее (По состоянию на ноябрь 2011 года с самыми последними версиями Chrome, Firefox с Палий):
- больше никаких предупреждений от Chrome, когда JSON загружается с сервера.
- Firebug добавит вкладку в ответ, показывающий вам данные JSON форматированный. Если тип MIME отличается, он будет отображаться как Ответ содержание.
не все работает для типа контента application/json
.
если вы используете Ext JS форма отправки для загрузки файла, имейте в виду, что ответ сервера анализируется браузером для создания документа для <iframe>
.
если сервер использует JSON для отправки возвращаемого объекта, то Content-Type
заголовок должен быть установлен в text/html
для того, чтобы сказать браузеру вставить текст без изменений в тело документа.
посмотреть Ext JS 3.4.0 API документация.
JSON является проблемно-ориентированный язык (DSL) и формат данных, независимый от JavaScript, и как таковой имеет свой собственный МИМ тип, application/json
. Уважение к типам MIME, конечно, управляется клиентом, поэтому text/plain
может сделать для передачи байтов, но тогда вы будете подталкивать интерпретацию к домену приложения поставщика без необходимости -application/json
. Вы бы передали XML через text/plain
?
но, честно говоря, ваш выбор типа MIME-это совет клиенту относительно как интерпретировать данные- text/plain
или text/HTML
(когда это не HTML) похоже на стирание типа - это так же неинформативно, как создание всех ваших объектов типа Object на типизированном языке.
никакая среда выполнения браузера, о которой я знаю, не возьмет документ JSON и автоматически сделает его доступным для среды выполнения в качестве доступного объекта JavaScript без вмешательства, но если вы работаете с искалеченным клиентом, это совсем другое дело. Но это еще не все ... --15-->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, Общий Lisp, E, Erlang, Go, Java, JavaScript, Lua, объективный 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
для некоторых это API для работы с AJAX.
примеры:
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
на Контент-Тип заголовок должен быть установлен в '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");
на Весна у вас есть определенный тип модели: MediaType.APPLICATION_JSON_VALUE
что эквивалентно application / 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"));
Если JSON с заполнением, то это будет application/jsonp
. Если JSON без заполнения, то это будет application/json
.
чтобы иметь дело с обоими, рекомендуется использовать: "приложение / javascript", не беспокоясь о том, с заполнением или без заполнения.
для JSON я использую:
Content-Type: application/json
это описано в предложении формата 7158 обмена данными JSON IETF,раздел 1.2: технические характеристики JSON.
разработчики PHP используют это:
<?php
header("Content-type: application/json");
// Do something here...
?>
расширение принятых ответов, когда вы используете JSON в контексте REST...
есть сильный аргумент о application/x-resource+json
и application/x-collection+json
когда вы представляете ресурсы и коллекции REST.
и если вы решите следовать jsonapi спецификации вы должны использование application/vnd.api+json
, как это задокументировано.
Altough нет универсального стандарта, ясно, что добавлен семантический передаваемые ресурсы оправдывают более явное Контент-Тип не просто application/json
.
следуя этому рассуждению, другие контексты могут оправдать более конкретный Контент-Тип.
Если вы получаете данные из REST API в JSON, поэтому вам нужно использовать content-type
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
JSON (обозначение объекта JavaScript) и JSONP ("JSON с заполнением") форматы, кажется, очень похожи, и поэтому может быть очень запутанным, какой тип MIME они должны использовать. Несмотря на то, что форматы кажутся очень похожими, между ними есть некоторые тонкие различия.
поэтому всякий раз, когда у меня есть какие-либо сомнения, у меня очень простой подход (который отлично работает в большинстве случаев), а именно, пойти и проверить соответствующий RFC документ.
JSON RFC 4627 (тип носителя application/json для обозначения объектов JavaScript (JSON)) является спецификацией формата JSON. В разделе 6 говорится, что тип носителя MIME для текста JSON -
application/json.
JSONP
JSONP ("JSON с заполнением") обрабатывается иначе, чем JSON, в браузере. JSONP рассматривается как обычный скрипт JavaScript, и поэтому он должен использовать application/javascript,
текущий официальный тип MIME для Яваскрипт. Во многих случаях, однако, text/javascript
тип MIME тоже будет работать нормально.
отметим, что text/javascript
был отмечен как устаревший RFC 4329 (типы носителей сценариев) документ и рекомендуется использовать тип. Однако, по причинам наследия,text/javascript
по-прежнему широко используется и имеет поддержку кросс-браузера (что не всегда бывает с application/javascript
тип MIME, особенно со старыми браузерами).
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 было официально зарегистрировано.