Ресурс интерпретируется как документ, но передается с предупреждением типа MIME / json в инструментах разработчика Chrome.

У меня есть следующий фрагмент, в котором используется плагин jQuery Form для отправки формы на сервер (в ajax).

  var options = {
    dataType: "json",
    success: function(data) { 
      alert("success");
    } 
  }; 

  $form.ajaxSubmit(options);

Форма:

<form enctype="multipart/form-data" id="name_change_form" method="post" action="/my_account/"> 
<div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='6c9b552aaba88b8442077e2957e69303' /></div> 
  <table> 
    <tr> 
      <td> 
        <label for="id_first_name">First name</label>:
      </td> 
      <td> 
        <input name="first_name" value="Patrick" maxlength="30" type="text" id="id_first_name" size="30" /> 
      </td> 
    </tr> 
    <tr> 
      <td> 
        <label for="id_last_name">Last name</label>:
      </td> 
      <td> 
        <input name="last_name" value="Sung" maxlength="30" type="text" id="id_last_name" size="30" /> 
      </td> 
    </tr> 
  </table> 
  <input type="hidden" name="form_id" value="name_change_form" /> 
</form> 

Реализация ajax работает нормально. Но я получаю предупреждение

Ресурс интерпретируется как документ, но передается с использованием типа MIME application / json

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

Я перешел на $.post, и с тех пор ошибка исчезла по волшебству. Понятия не имею, почему $.post работает, а $form.ajaxSubmit нет. Если бы кто-то мог предложить свое объяснение, это было бы здорово. По крайней мере, эта проблема решена. Ниже новый код.

var url = $form.attr("action");
$.post(
  url, 
  $form.serialize(), 
  function(data) {
    alert("success");
  },
  "json"
); 

person tamakisquare    schedule 03.08.2011    source источник
comment
Я намеревался получить ответ сервера в формате json. Думаю, мне нужно заставить браузер понимать, что он должен интерпретировать ответ в json. Если моя догадка верна, как мне это сделать?   -  person tamakisquare    schedule 04.08.2011


Ответы (7)


Я столкнулся с той же ошибкой. Решение, которое сработало для меня:

Со стороны сервера, возвращая ответ JSON, измените тип содержимого: text / html

Теперь браузеры (Chrome, Firefox и IE8) не выдают ошибку.

person HB.    schedule 13.08.2011
comment
@ quangtruong1985 - response = HttpResponse("Text only, please.", mimetype="text/html") - person tamakisquare; 20.09.2011
comment
Я тянула за волосы больше 30 минут. Спасибо за решение. - person Tariqulazam; 16.06.2017
comment
Я не согласен. Заголовок типа контента должен соответствовать фактическому контенту, иначе вы рискуете неправильно вести себя со стороны клиентов. Если вы отправляете ответ JSON, нет смысла устанавливать тип содержимого text / html. Ваш клиент должен отправить правильный заголовок Accepts, как подробно описано в другом ответе - person Phil; 18.10.2017

Этот тип предупреждений обычно помечается из-за HTTP-заголовков запроса. В частности, заголовок запроса Accept. Документация MDN для состояний заголовков HTTP

The Accept request HTTP header advertises which content types, expressed as MIME types, the client is able to understand. Using content negotiation, the server then selects one of the proposals, uses it and informs the client of its choice with the Content-Type response header. Browsers set adequate values for this header depending of the context where the request is done....

application / json, вероятно, не входит в список типов MIME в заголовке Accept, отправляемом браузером, следовательно, появляется предупреждение.

Решение

Пользовательские заголовки HTTP могут быть отправлены только программно через XMLHttpRequest или любую из оболочек библиотеки js, реализующих его.

person Kudehinbu Oluwaponle    schedule 29.05.2017
comment
Это наиболее правильный и информативный ответ. Мне было интересно, почему это происходит со мной при переходе к конечным точкам JSON API прямо в моем браузере. - person Phil; 18.10.2017

На самом деле это особенность Chrome, а не библиотеки JavaScript. Вот исправление:

Чтобы сообщение не появлялось, а также чтобы Chrome мог отображать ответ в консоли в формате JSON, добавьте строку запроса к URL-адресу запроса.

e.g

var xhr_object = new XMLHttpRequest();

var url = 'mysite.com/'; // Using this one, Chrome throws error

var url = 'mysite.com/?'; // Using this one, Chrome works

xhr_object.open('POST', url, false);
person John    schedule 30.09.2011

Я выбрал другой подход. Я переключился на использование $ .post, и с тех пор ошибка исчезла.

person tamakisquare    schedule 16.08.2011

Это случилось со мной, и как только я удалил это: enctype = "multipart / form-data", он начал работать без предупреждения

person daviddv    schedule 29.09.2013

вы можете просто использовать JSON.stringify (options) для преобразования объекта JSON в строку перед отправкой, затем предупреждение отклоняется и отлично работает

person driftcrow    schedule 27.09.2012

Используйте 1_. Раньше у меня была такая же ошибка. Это исправлено для меня.

person Roland Kákonyi    schedule 15.01.2013