Каков правильный тип контента JSON?

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

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

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

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

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

Вам также может понравиться

About the Author: qw

30 комментариев

  1. Для текста JSON:

    application/json

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

    Для JSONP (runnable javascript) с обратным вызовом:



    application/javascript

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

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

    Когда его спросили о том, почему не text/json, Крокфорд, похоже, сказал, что JSON на самом деле не JavaScript, а текст, а IANA скорее всего передаст application/*, чем text/*.



    Дополнительные ресурсы:

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

  4. 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

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

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

    application/json json
    

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

    sudo service apache2 restart
    

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

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

  8. Нет сомнений в том, что application/json является лучшим MIME для ответа JSON.

    Но у меня был некоторый опыт, когда мне пришлось использовать application/x-javascript из-за некоторых проблем с компрессией. Моя среда размещения — это общий хостинг с GoDaddy. Они не позволяют мне менять конфигурацию сервера. Я добавил следующий код в мой web.config файл для сжатия ответов.

    <httpCompression>
        <scheme name="gzip" dll="%Windir%system32inetsrvgzip.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.

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

    • Больше никаких предупреждений от Chrome при загрузке JSON с сервера.
    • Firebug добавит вкладку в ответ, показывающий вам данные JSON
      отформатирована. Если тип MIME отличается, он будет отображаться как
      "Содержимое ответа".
  10. Не все работает для типа контента application/json.

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

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

    См. документацию API Ext JS 3.4.0.

  11. 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!

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

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

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

    В целом, всякий раз, когда у вас возникают сомнения в отношении типов контента, вы должны проверить эту ссылку

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

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

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

  15. "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())
      }
    }
    

  16. Регистрация IANA для application/json говорит

    Приложения, использующие этот тип носителя: JSON использовался для обмена данными между приложениями, написанными на всех этих языках программирования: ActionScript, 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

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

    НО

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

    text/html
    
    application/javascript
    

  18. Заголовок заголовка 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");
    

  19. 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"));
    

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

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

  21. Расширение принятых ответов, когда вы используете JSON в контексте REST…

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

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

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

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

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

    <?php
        header("Content-type: application/json");
    
        // Do something here...
    ?>
    

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

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

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

    JSON
    RFC 4627 (Тип приложения /json Media для обозначения объектов JavaScript (JSON)) является спецификацией формата JSON. В разделе 6 говорится, что тип мультимедиа MIME для текста JSON

    application/json.
    

    JSONP
    JSONP ( "JSON с дополнением" ) обрабатывается по-разному, чем JSON, в браузере. JSONP рассматривается как обычный JavaScript script, и поэтому он должен использовать application/javascript, текущий официальный MIME-тип для JavaScript. Во многих случаях, однако, тип text/javascript MIME будет работать отлично.

    Обратите внимание, что text/javascript помечается как устаревший документ RFC 4329 (Scripting Media Types), и рекомендуется использовать application/javascript вместо этого. Однако из-за унаследованных причин text/javascript по-прежнему широко используется и поддерживает кросс-браузер (что не всегда относится к типу application/javascript MIME, особенно в старых браузерах).

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *