Почему нам не нужен dataType: "json" при вызове AJAX (условно)? - PullRequest
0 голосов
/ 04 мая 2020

Я заметил, что нам не нужно включать dataType: "json" в наш вызов AJAX, если файл сервера уже имеет формат .json, например,

index. html

$.ajax({
    url: "ajax/test.json",
    data: "id="+id,
    cache: false,
    type: "POST",
    success: function(response){
        // Some more stuff here...
    }
});

test. json

{ 
    "fname" : "Aileen", 
    "lname" : "Brown", 
    "email" : "ab@gmail.com", 
    "phone" : "1234567890", 
    "country" : "USA" 
}

Но если нам нужно извлечь вышеуказанное содержимое из файла PHP через базу данных MySQL

index. html

$.ajax({
    url: "ajax/test.php",
    data: "id="+id,
    cache: false,
    type: "POST",
    dataType: "json",
    success: function(response){
        // Some more stuff here...
    }
});

test. php

<?php
$data = array(
                "fname"     => "Aileen",
                "lname"     => "Brown",
                "email"     => "ab@gmail.com",
                "phone"     => "1234567890",
                "country"   => "USA"
            );

// Convert PHP array into JSON object
echo json_encode($data);
?>

Ответ от этого сервер PHP файл через AJAX вызов в консоли веб-браузера собирается в том же формате JSON, что и мой test.json файл.

{"fname":"Aileen","lname":"Brown","email":"ab@gmail.comk","phone":"1234567890","country":"USA"}

Может кто-нибудь, пожалуйста, объясните мне правильно, почему с помощью dataType: "json" является обязательным, если данные должны быть получены из файла PHP, а не из файла JSON, если формат данных, поступающих с сервера, идентичен?

Ответы [ 2 ]

3 голосов
/ 04 мая 2020

Короче говоря, это из-за ошибки в вашем PHP коде.

Любой HTTP-запрос или ответ с телом имеет соответствующий Content-Type в заголовках, чтобы описать, какой тип данных это .

По умолчанию jQuery будет анализировать полученный ответ в соответствии с заголовком Content-Type, который он получил. dataType заставляет его игнорировать этот заголовок (а также устанавливать заголовок Accept для запроса).

Большинство веб-серверов в наши дни настроены по умолчанию , так что файл с Расширение файла .json получает заголовок Content-Type: application/json.

Любая программа PHP выведет, опять же, по умолчанию , заголовок Content-Type: text/html, если он не переопределен с использованием header function .

Поскольку ваш PHP не включает header("Content-Type: application/json"), он сообщает веб-браузеру, что отправляет HTML и jQuery пытается проанализировать JSON, как если бы он были HTML.

1 голос
/ 04 мая 2020

Это связано с тем, что Content-Type, отправленный в заголовке для файла .json, уже application/json, тогда как "обычный" PHP файл имеет text/html.

jQuery AJAX использует "Intelligent Guess", чтобы определить тип данных из MIME-типа файла, если не установлено dataType:

Тип данных, которые вы ожидаете от сервера. Если ничего не указано, jQuery попытается вывести его на основе MIME-типа ответа (XML MIME-тип даст XML, в 1.4 JSON даст объект JavaScript, в скрипте 1.4 выполнит скрипт, а все остальное будет возвращено в виде строки).

(см. https://api.jquery.com/jQuery.ajax/)

Вы можете легко наблюдать это поведение в консоли разработчика (здесь я использовал Firefox встроенная версия):

Example

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...