Я некоторое время возился с JSON, просто передавая его в виде текста, и это никому не повредило (насколько я знаю), но я хотел бы начать делать все правильно.
Я видел очень много предполагаемых "стандартов" для типа содержимого JSON:
application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json
Но какой из них правильный или лучший? Я понимаю, что между ними есть проблемы безопасности и поддержки браузеров.
Я знаю, что есть похожий вопрос, Какой тип MIME, если JSON возвращается REST API?, но я хотел бы получить более целенаправленный ответ.
Для текста JSON:
application/json
.
Тип MIME-медиа для текста JSON -
application/json
. По умолчанию используется кодировка UTF-8. (Источник: RFC 4627).
Для JSONP (запускаемый javascript) с обратным вызовом:
application/javascript
.
Вот некоторые статьи из блога, которые были упомянуты в комментариях и которые имеют отношение к делу.
IANA зарегистрировала официальный MIME Type для JSON как application/json
.
На вопрос, почему не text/json
, Крокфорд, кажется, ответил, что JSON - это не совсем JavaScript и не текст, а также IANA с большей вероятностью выдаст application/*
, чем text/*
.
Дополнительные ресурсы:
Конечно, правильный тип 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);
}
};
Ответ динамически генерируемых данных, в соответствии с параметрами запроса в URL-адресе.
Пример:
{ "Name": "Foo", "Id": 1234, "Rank": 7 }
Контент-тип: приложение/JSON
JSON с подкладкой. Ответ JSON-данные, при вызове функции, обернутые вокруг него.
Пример:
functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});
Контент-тип: приложение/JavaScript
Если вы используете Ubuntu или Debian, и вы служите .JSON-файлы через Apache, вы, возможно, захотите, чтобы служить файлы с правильным типом контента. Я делаю это прежде всего потому, что я хочу использовать расширение Firefox JSONView
Модуль Apache mod_mime поможет вам сделать это легко. Однако, в Ubuntu вам необходимо отредактировать файл /и т. д./мим.типы и добавьте строку
application/json json
Затем перезапустить Apache:
sudo service apache2 restart
Если вы вызываете ASP.NET Web Services со стороны клиента, вам необходимо использовать application/json
, чтобы это работало. Я полагаю, что это то же самое для фреймворков jQuery и Ext.
Правильный тип содержимого для JSON-это приложение/JSON
, если вы не're, используя JSONP в, также известный как JSON с подкладкой, которая на самом деле JavaScript и поэтому правильный тип контента будет приложение/JavaScript
.
Нет никаких сомнений, что приложение/JSON
- лучшее МИМ тип ответа JSON.
Но я имел некоторый опыт, где я должен был использовать `приложения/x-javascript и из-за некоторых проблем сжатия. Мой хостинг среда хостинга с у GoDaddy. Они не позволяют мне менять конфигурации сервера. Я добавил следующий код в мой веб.файл конфигурации для сжатия ответов.
<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-молнии, но JSON ответы не были. Я добавил
<add mimeType="application/json" enabled="true"/>
в статических и динамических разделов видах. Но это не компресс JSON ответы на все.
После этого я удалила этот добавленный тип и добавил
<add mimeType="application/x-javascript" enabled="true"/>
в обоих статических и динамических разделов видах, и изменил тип реагирования в
.данного (асинхронный обработчик) в
application/x-javascript
И теперь я обнаружил, что мой JSON ответы были сжаты с G-молнии. Поэтому я лично рекомендую использовать
application/x-javascript
только если вы хотите сжать ваш JSON ответы на хостинга окружающей среды. Потому что в хостинга, они не позволяют вам изменить ИИС конфигурации.
Только при использовании приложение/JSON
как МИМ тип у меня есть следующие (по состоянию на ноябрь 2011 года с последними версиями Chrome, Firefox с Жучка):
Не все работает для типа контента приложение/JSON
.
Если вы используете доб&ампер;усилитель; nbsp;в JS форма отправить, чтобы загрузить файл, мы предупреждаем, что ответ сервера обрабатывается браузером, чтобы создать документ Для в <iframe в>
.
Если сервер с помощью JSON, чтобы отправить возвращаемый объект, то заголовок тип содержимого
должен быть установлен в текст/HTML
, чтобы сообщить браузеру, чтобы вставить текст без изменений в тексте документа.
JSON-это доменного языка (ДСЛ) и формат данных, независимый от языка JavaScript, и как таковое имеет свои собственные МИМ типа приложение/JSON
. Уважение типов MIME, конечно, управляемый клиентом, поэтому текст/равнина
может сделать для передачи байта, но тогда вы бы взвинчивая толкования к домену приложения без надобности - приложение/JSON
. Вы бы передачу XML через текст/равнина
?
Но, честно говоря, ваш выбор тип MIME консультаций клиенту о том, как интерпретировать данные- текст/равнина
или текст/HTML
(когда он'ы не html) как тип стирания - это's, как неинформативные, как сделать все объекты типа Object в типизированном языке.
Без выполнения браузером я знаю, будет принимать JSON-документ и автоматически сделать его доступным для выполнения в качестве доступного объекта JavaScript без вмешательства, но если вы работаете с хромой клиента, что'ы совершенно другое дело. Но, что's не вся история- спокойный JSON-сервисов часто не'т содержать JavaScript время выполнения, но это вовсе'т остановить их с помощью JSON в качестве жизнеспособного формата обмена данными. Если клиенты, которые покалечили... тогда я хотел бы рассмотреть, пожалуй, HTML инъекции через Аякс шаблонизатора вместо этого.
Приложение/JSON!
Если вы'вновь в клиентской среде, исследуя о кросс-браузер поддержка является обязательной для хорошо поддерживает веб-приложения.
Правильный тип содержимого HTTP будет приложение/JSON
, как другие уже тоже выделены, но некоторые клиенты не очень хорошо, что's, почему в jQuery рекомендует по умолчанию текст/HTML
.
Правильный ответ:
Content-Type: application/json
Как многие другие упомянули, приложение/JSON
- это правильный ответ.
Но то, что не'т не объяснил, что других вариантов ты предложил значит.
приложение/х-на JavaScript
: экспериментальная тип MIME для JavaScript перед приложение/JavaScript
был сделан стандарт.
текст/JavaScript
: теперь устаревшим. Вы должны использовать приложение/JavaScript
при использовании JavaScript.
текст/х-на JavaScript
: экспериментальная тип MIME для описанной выше ситуации.
текст/х-формат JSON
: экспериментальная тип MIME для JSON перед приложение/JSON
официально зарегистрировались.
Все в всех, когда у вас есть какие-либо сомнения о типах контента, вы должны проверить этой ссылке
В ССП, Вы можете использовать это в директиве страницы:
<%@ page language="java" contentType="application/json; charset=UTF-8"
pageEncoding="UTF-8"%>
Правильный МИМ тип носителя для JSON-это приложение/JSON
. JSP будет использовать его для отправки ответа клиенту.
“`приложение/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 для приложение/JSON
говорит
приложения, которые используют этот тип носителя: JSON были использованы для обмен данными между приложениями, написанными во всех этих языки программирования: ActionScript с, С, С#, в Clojure, на ColdFusion, Общий Лисп, е, Эрланг, Давай, Ява, яваскрипт, Луа, цель CAML, На Perl, РНР, питон, Rebol, с Рубином, Scala и схема.
Вы'Лл замечают, что IANA.org не't список какой-либо из этих других видов медиа, на самом деле даже приложение/JavaScript
является теперь устаревшим. Так что приложение/JSON
- это действительно единственно возможный правильный ответ.
Поддержка браузеров-это другое дело.
Наиболее широко поддерживает нестандартные типы носителей текст/JSON с
или текст/JavaScript
. Но некоторые знаменитости даже использовать текст/равнина
.
Еще более странным является контент-тип заголовка, отправленного компанией Flickr, который возвращает JSON, как текст/XML
. Текста Google использует русский язык
для некоторых это'API-интерфейсов с помощью AJAX.
Примеры:
curl -I "https://ajax.googleapis.com/ajax/services/search/video?v=1.0&q=jsonexample"
Вывод: содержимое-тип: текст/JavaScript
curl -I "https://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=f82254c1491d894f1204d8408f645a93"
Вывод: содержимое-тип: текст/XML