Что такое правильный тип содержимого в формате JSON?
я возился с JSON в течение некоторого времени, просто выталкивая его как текст, и это никому не повредило (что я знаю), но я хотел бы начать делать все правильно.
Я видел так многие предполагаемые "стандарты" для типа контента JSON:
application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json
но что правильно, или лучше? Я предполагаю, что есть проблемы безопасности и поддержки браузера, различающиеся между ними.
Я знаю, что есть подобный вопрос, какой тип MIME, если JSON возвращается REST API?, но я хотел бы немного более целенаправленный ответ.
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/*.больше ресурсов:
для JSON:
Content-Type: application/jsonна JSON-P:
Content-Type: application/javascript
конечно, правильный тип носителя MIME для JSON -
application/json, но необходимо понимать, какой тип данных ожидается в вашем приложении.например, я использую Ext GWT и ответ сервера должен идти как текст / 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 тип ответа, браузер предлагает мне сохранить файл.
фрагмент исходного кода на стороне сервера с помощью 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 }Content-Type:
application/json
JSON-P:
JSON с подкладкой. Ответ - это данные JSON с обернутым вокруг него вызовом функции.
пример:
functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});Content-Type:
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лучший 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 были сжаты с помощью г-молнии. Поэтому я лично рекомендую использовать
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для того, чтобы сообщить браузеру, чтобы вставить текст без изменений в тексте документа.посмотреть Ext JS 3.4.0 API документация.
JSON-это проблемно-ориентированный язык (DSL) и формат данных, независимый от JavaScript, и как таковой имеет свой собственный MIME тип,
application/json. Уважение к типам MIME, конечно, управляется клиентом, поэтомуtext/plainможет сделать для передачи байтов, но тогда вы будете подталкивать интерпретацию к домену приложения поставщика излишне -application/json. Вы бы передали XML черезtext/plain?но честно говоря, ваш выбор типа MIME-это совет клиенту относительно как интерпретировать данные-
text/plainилиtext/HTML(когда это не HTML) похоже на стирание типа - это так же неинформативно, как создание всех ваших объектов типа Object на типизированном языке.ни одна браузерная среда выполнения, о которой я знаю, не возьмет документ JSON и автоматически сделает его доступным для среды выполнения как доступный объект JavaScript без вмешательства, но если вы работаете с искалеченным клиентом, это совсем другое дело. Но это еще не все- спокойный Службы JSON часто не имеют времени выполнения JavaScript, но это не мешает им использовать JSON в качестве жизнеспособного формата обмена данными. Если клиенты настолько искалечены... тогда я бы рассмотрел, возможно, инъекцию HTML через Ajax вместо этого служба шаблонов.
Application / 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()) } }
The Регистрация 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для некоторых это API для работы с AJAX.примеры:
curl -I "https://ajax.googleapis.com/ajax/services/search/video?v=1.0&q=jsonexample"выход:
Content-Type: text/javascriptcurl -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
The 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");
In Весна у вас есть определенный тип модели:
MediaType.APPLICATION_JSON_VALUEчто эквивалентно application / json.
The
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 нет универсального стандарта, понятно, что добавленная семантика передаваемые ресурсы оправдывают более явное Content-Type не просто
application/json.следуя этому рассуждению, другие контексты могли бы оправдать более конкретный Content-Type.
Если вы получаете данные из 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 Object Notation) и 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 (скриптовые типы носителей) документ и рекомендуется использоватьapplication/javascriptвведите вместо этого. Однако, из-за наследственных причин,text/javascriptпо-прежнему широко используется и имеет кросс-браузерную поддержку (что не всегда имеет место сapplication/javascriptтип MIME, особенно с более старыми браузерами).
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, но устаревшиеContent-type: text/x-json- json до подачи заявки / json был официально зарегистрирован.
Comments