Заголовок заголовка содержимого HTTP и JSON

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

Однако я сказал себе, что сегодня я столкнусь со страхом и начну целенаправленно использовать заголовки. Я пытался отправить данные json в браузер и сразу их использовать. Например, если у меня есть обработчик Ajax в состоянии готовности 4, который выглядит так:

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

И я установил заголовок типа контента в своем коде PHP:

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

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

Ответ 1

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

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

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

Ответ 2

Content-Type: application/json это просто заголовок контента. Заголовок содержимого - это просто информация о типе возвращаемых данных, например, :: JSON, изображение (png, jpg и т.д.), Html.

Имейте в виду, что JSON в JavaScript - это массив или объект. Если вы хотите просмотреть все данные, используйте console.log вместо alert:

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

Если вы хотите предупредить исходное содержимое 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 the wrong JavaScript code:
<script>var returndata="{"text":"omrele"}";</script>

Ответ 3

Приведенный ниже код помогает мне возвратить объект JSON для JavaScript на внешнем интерфейсе

Код моего шаблона

template_file.json

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

Python-поддерживаемый код

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);
    });