Zawsze starałem się unikać używania większości właściwości protokołu HTTP'ze względu na strach przed nieznanym.
Powiedziałem sobie jednak, że dziś stawię czoła strachowi i zacznę świadomie używać nagłówków. Od jakiegoś czasu staram się wysyłać dane json
do przeglądarki i od razu je wykorzystywać. Na przykład, jeśli mam funkcję Ajax handler na ready state 4, która wygląda tak:
function ajaxHandler(response){
alert(response.text);
}
I mam ustawiony nagłówek content-type w moim kodzie PHP:
header('Content-Type: application/json');
echo json_encode(array('text' => 'omrele'));
Dlaczego nie mogę'uzyskać bezpośredniego dostępu do właściwości z funkcji obsługi, gdy przeglądarka jest wyraźnie poinformowana, że przychodzące dane to application/json
?
Nagłówek Content-Type
jest po prostu używany jako informacja dla twojej aplikacji. Przeglądarka nie dba o to, co to jest. Przeglądarka po prostu zwraca Ci dane z wywołania AJAX. Jeśli chcesz przetworzyć je na JSON, musisz to zrobić samodzielnie.
Nagłówek jest tam po to, aby Twoja aplikacja mogła wykryć jakie dane zostały zwrócone i jak powinna je obsłużyć. Musisz spojrzeć na nagłówek, i jeśli jest to application/json
to sparsować go jako JSON.
Tak właśnie działa jQuery. Jeśli nie powiesz mu, co zrobić z wynikiem, użyje Content-Type
, aby wykryć, co z nim zrobić.
Content-Type: application/json` jest tylko nagłówkiem treści. Nagłówek treści jest tylko informacją o typie zwracanych danych, np::JSON,image(png,jpg,etc..),html.
Należy pamiętać, że JSON w JavaScript jest tablicą lub obiektem. Jeśli chcesz zobaczyć wszystkie dane, użyj console.log zamiast alert:
alert(response.text); // Will alert "[object Object]" string
console.log(response.text); // Will log all data objects
Jeśli chcesz, aby alert zawierał oryginalną zawartość JSON jako ciąg znaków, dodaj pojedyncze cudzysłowy ('):
echo "'" . json_encode(array('text' => 'omrele')) . "'";
// alert(response.text) will alert {"text":"omrele"}
Nie używaj podwójnych cudzysłowów. Będzie to dezorientować JavaScript, ponieważ JSON używa podwójnych cudzysłowów na każdej wartości i kluczu:
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>
Poniższy kod pomaga mi zwrócić obiekt JSON dla JavaScript na front-endzie
Mój kod szablonu
template_file.json
{
"name": "{{name}}"
}
Kod wspierany przez Pythona
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")
Plik url.py
url(r'^download_as_json/$', views.download_json, name='download_json-url')
kod jQuery dla frontendu
$.ajax({
url:'{% url 'download_json-url' %}'
}).done(function(data){
console.log('json ', data);
console.log('Name', data.name);
alert('hello ' + data.name);
});