it-roy-ru.com

Каков правильный тип содержимого JSON?

Я возился с JSON в течение некоторого времени, просто выдвигая это как текст, и это никому не повредило (что я знаю), но я хотел бы начать делать вещи должным образом.

Я видел так многие предполагаемые "стандарты" для типа контента JSON:

application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json

Но какой из них правильный или лучший? Я понимаю, что между ними существуют проблемы с безопасностью и поддержкой браузера.

Я знаю, что есть похожий вопрос, Какой тип MIME, если JSON возвращается API REST?, но я бы хотел получить более точный ответ.

9765
Oli

Для текста JSON:

application/json

Тип мультимедиа для текста JSON: application/json. Кодировка по умолчанию - UTF-8. (Источник: RFC 4627 ).

Для JSONP (исполняемый JavaScript) с обратным вызовом:

application/javascript

Вот некоторые сообщения в блоге, которые были упомянуты в комментариях, которые имеют отношение к делу.

9778
Gumbo

IANA зарегистрировал официальный тип MIME для JSON как application/json.

На вопрос о том, почему нет text/json, Крокфорд, похоже, сказал, что JSON на самом деле не является ни JavaScript, ни текстом, а также IANA с большей вероятностью раздаст application/*, чем text/*.

Больше ресурсов:

1565
gnrfan

Для JSON:

Content-Type: application/json

Для JSON-P :

Content-Type: application/javascript
842
Alix Axel

Конечно, правильный тип носителя 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);
    }
};
615
Mikhail.Mamaev

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

454
Bhavin

Если вы используете Ubuntu или Debian и обслуживаете файлы .json через Apache, вы можете использовать файлы с правильным типом содержимого. Я делаю это в первую очередь потому, что я хочу использовать расширение Firefox JSONView

Модуль Apache mod_mime поможет сделать это легко. Однако в Ubuntu вам нужно отредактировать файл /etc/mime.types и добавить строку

application/json json

Затем перезапустите Apache:

Sudo service Apache2 restart
390
Gourneau

Если вы вызываете веб-службы ASP.NET со стороны клиента, вы должны использовать application/json для его работы. Я считаю, что это то же самое для jQuery и Ext фреймворков.

375
markvpc

Правильный тип контента для JSON: application/json, ЕСЛИ вы не используете JSONP , также известный как JSON с Padding, который на самом деле является JavaScript, и поэтому правильным типом контента будет application/javascript.

298
Resist Design

Нет сомнений в том, что 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 конфигурации.

286
shashwat

Только при использовании application/json в качестве типа MIME у меня появляется следующее (по состоянию на ноябрь 2011 года с самыми последними версиями Chrome, Firefox с Firebug ):

  • Больше нет предупреждений от Chrome при загрузке JSON с сервера.
  • Firebug добавит вкладку в ответ, показывающую вам отформатированные данные JSON. Если тип MIME отличается, он будет отображаться как "содержимое ответа".
261
Ivo Limmen

Не все работает для типа контента application/json.

Если вы используете Ext JS форму отправки для загрузки файла, имейте в виду, что ответ сервера анализируется браузером для создания документа для <iframe>.

Если сервер использует JSON для отправки возвращаемого объекта, заголовок Content-Type должен быть установлен на text/html, чтобы указать браузеру вставлять текст без изменений в тело документа.

Смотрите документация по API Ext JS 3.4. .

236
Conan

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!

220
VLostBoy

Если вы находитесь в клиентской среде, изучение поддержки кроссбраузерности обязательно для хорошо поддерживаемого веб-приложения.

Правильным HTTP Content-Type будет application/json, как уже отмечали другие, но некоторые клиенты не справляются с этим очень хорошо, поэтому jQuery рекомендует использовать text/html по умолчанию.

203
Emanuele Del Grande

Правильный ответ:

Content-Type: application/json
162
Irfan DANISH

Как уже упоминали многие, правильный ответ - 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.

В общем, когда у вас есть какие-либо сомнения по поводу типов контента, вы должны проверить эта ссылка

160
fcm

В JSP вы можете использовать это в директиве страницы:

<%@ page language="Java" contentType="application/json; charset=UTF-8"
    pageEncoding="UTF-8"%>

Правильный MIME тип мультимедиа для JSON - application/json. JSP будет использовать его для отправки ответа клиенту.

143
raja

"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())
  }
}
110
Sukane

регистрация 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

103
user1596138

Правильный тип MIME application/json

НО

Я сталкивался со многими ситуациями, когда требовался тип браузера или пользователь фреймворка:

text/html

application/javascript
85
LombaX

Я использую ниже

contentType: 'application/json',
data: JSON.stringify(SendData),
72
Andro

Заголовок 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");
64
Alexander Burakevych

В Spring у вас есть определенный тип: MediaType.APPLICATION_JSON_VALUE, который эквивалентен application/json .

57
Chand Priyankara

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"));
57
Chetabahana

Для JSON я использую:

 Content-Type: application/json

Это описано в предложении IETF о формате обмена данными JSON 7158, Раздел 1.2: Спецификации JSON .

49
Mehmet_

Если JSON с отступом, это будет application/jsonp. Если JSON без заполнения, тогда это будет application/json.

Чтобы справиться с обоими, хорошей практикой является использование: application/javascript, не беспокоясь о том, идет ли это с заполнением или без заполнения.

49
Ankit Zalani

Расширение принятых ответов при использовании JSON в контексте REST ...

Существует сильный аргумент об использовании application/x-resource+json и application/x-collection+json, когда вы представляете REST ресурсы и коллекции.

И если вы решите следовать спецификации jsonapi , вам следует использовать application/vnd.api+json, как это задокументировано.

Хотя универсального стандарта не существует, ясно, что добавленная семантика к передаваемым ресурсам оправдывает более явный Content-Type , чем просто application/json.

Следуя этому рассуждению, другие контексты могут оправдать более конкретный Content-Type .

42
jgomo3

PHP разработчики используют это:

<?php
    header("Content-type: application/json");

    // Do something here...
?>
41
user3087089

Если вы получаете данные из 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
38
Krishna

Форматы JSON (нотация объектов JavaScript) и JSONP ("JSON with padding"), похоже, очень похожи, и поэтому может быть очень странно, какой тип MIME они следует использовать. Хотя форматы похожи, между ними есть некоторые тонкие различия.

Поэтому, когда бы ни возникали какие-либо сомнения, у меня есть очень простой подход (который в большинстве случаев работает отлично), а именно, пойти и проверить соответствующий документ RFC.

JSONRFC 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 (типы сценариев), и вместо него рекомендуется использовать тип application/javascript. Однако из-за устаревших причин text/javascript по-прежнему широко используется и имеет межбраузерную поддержку (что не всегда имеет место с типом application/javascript MIME, особенно в старых браузерах).

24
Iresha Rubasinghe

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 было официально зарегистрировано.

23
Kashif Solangi

Чтобы указать интересный результат JSON, вы добавляете "application/json" в заголовок вашего запроса, как показано ниже:

"Accept: application/json" - это желаемый формат ответа.

"Content-Type: application/json" указывает формат содержимого вашего запроса, но иногда вы указываете и application/json, и application/xml, но качество их может отличаться. Какой сервер отправит обратно разные форматы ответов, посмотрите на пример:

Accept:application/json;q=0.4,application/xml;q=8

Это вернет XML, потому что XML имеет более высокое качество.

6
behzad babaei

Правильный текущий стандарт - application/json. Хотя кодировкой по умолчанию является UTF-8, стоит упомянуть, что это также может быть UTF-16 или utf-32. Когда JSON пишется в UTF-16 или UTF-32, необходимо использовать двоичное кодирование передачи содержимого.

Подробнее о json можно узнать здесь: https://tools.ietf.org/html/rfc4627

больше информации о двоичной кодировке передачи здесь: https://www.w3.org/Protocols/rfc1341/5_Content-Transfer-Encoding.html

5
sammyb123

Чтобы дополнить остальные ответы, тип MIME для связанных данных JSON (JSON-LD) в соответствии с W3C :

application/ld+json

Введите имя: приложение

Имя подтипа: ld + json

Кроме того, из того же источника:

Расширение файла (ов) :

.jsonld

5
alejnavab

Всегда старайтесь запомнить эти три типа контента, даже если есть много типов контента . как вам, возможно, придется использовать их чаще.

  • Тип контента: приложение/JSON
  • Тип контента: application/xml
  • Тип контента: текст/HTML
2
cherankrish