Http Content-Type Header и JSON


хорошо, поэтому я всегда старался избегать использования большинства свойств протокола HTTP или как бы вы ни называли их ради страха перед неизвестным. Однако я сказал себе, что сегодня я столкнусь со страхом и начну целенаправленно использовать заголовки. То, что я пытался достичь здесь, это отправить json данные в браузер и использовать его сразу. Например, если у меня есть функция обработчика ajax в состоянии готовности 4, которая выглядит так

function ajaxHandler(response){
    alert(response.text);
}

и я поставил заголовок content-type в моем php

header('Content-Type: application/json');
echo json_encode(array('text' => 'omrele'));

мой вопрос: почему я не могу напрямую получить доступ к свойству из функции обработчика, когда браузеру ясно сказано, что входящие данные application/json?

3 106

3 ответа:

The Content-Type заголовок просто используется в качестве информации для вашего приложения. Браузеру все равно, что это такое. Браузер просто возвращает вам данные из вызова AJAX. Если вы хотите разобрать его как JSON, вам нужно сделать это самостоятельно.

заголовок есть, так что ваше приложение может определить, какие данные были возвращены и как он должен обрабатывать его. Вам нужно посмотреть на заголовок, и если это application/json затем разобрать его как JSON.

Это на самом деле, как jQuery работает. Если ты не скажешь это что делать с результатом, он использует Content-Type чтобы определить, что с ним делать.

Content-Type: application/json это просто заголовок контента, заголовок контента-это просто информация о типе возвращаемых данных, например::JSON,image(png,jpg и т. д..),формат HTML. Имейте в виду, что JSON в javascript-это массив или объект. если вы хотите увидеть все данные, используйте консоль.журнал вместо предупреждения

alert(response.text);//will alert "[object Object]" string
console.log(response.text);//will logging all data object

если вы хотите предупредить оригинальный JSON в виде строки, чем добавить одинарные кавычки ('):

echo "'" . json_encode(array('text' => 'omrele')) . "'";
//alert(response.text) will alert {"text":"omrele"}

не используйте двойные кавычки, это запутает javascript, потому что JSON использует двойную кавычку каждое значение и ключ:

echo '<script>var returndata=';
echo '"' . json_encode(array('text' => 'omrele')) . '"';
echo ';</script>';

//it will return wrong javascript code: 
<script>var returndata="{"text":"omrele"}";</script>

приведенный ниже код поможет мне вернуть объект json для js в интерфейсе

мой код шаблона template_file.json

{
    "name": "{{name}}"
}

python backed code

def download_json(request):
    print("Downloading json")
    #response render a template as json object
    return HttpResponse(render_to_response("template_file.json",dict(name="Alex Vera")),content_type="application/json")    

url.py

url(r'^download_as_json/$',views.download_json,name='download_json-url')

jQuery код для интерфейса

  $.ajax({
        url:'{% url 'download_json-url' %}'        
    }).done(function(data){
        console.log('json ',data);
        console.log('Name',data.name);
        alert('hello '+data.name);
    });