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



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



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



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


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



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

6251   30  

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

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

правильный тип контента для 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.

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

Content-Type: application/json

как и многие другие упоминали,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 официально зарегистрировались.

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

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

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

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

"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/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

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

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

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

Comments

    Ничего не найдено.