HTTP İçerik Türü Başlığı ve JSON


144

Her zaman bilinmeyen korkusu uğruna HTTP protokolü özelliklerinin çoğunu kullanmaktan kaçınmaya çalışıyorum.

Ancak kendime bugün korkuyla yüzleşeceğimizi ve başlıkları bilerek kullanmaya başlayacağımı söyledim. jsonTarayıcıya veri göndermeye ve hemen kullanmaya çalışıyorum. Örneğin, ben 4 durum gibi hazır durum 4 bir Ajax işleyicisi işlevi varsa:

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

Ve PHP kodumda içerik türü başlığını ayarladım:

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

Tarayıcıya gelen verilerin açık olduğu söylendiğinde neden özelliğe işleyici işlevinden doğrudan erişemiyorum application/json?


Doğru anlıyorsam, textyanıt değil, işleyicide bir javascript değişkeni olarak kullanmak ister misiniz ? Bu çok garip bir işlevsellik olurdu. Json_encode ayrıca PHP dizininizden 1 nesne oluşturur. Yani bu javascript içine almak bir değişkene atanması gerekir.
Aralık'ta Flashin

4
ContentType üstbilgisi yalnızca bilgi amaçlıdır. Tarayıcı bunu yapabiliyorsa kullanacaktır, ancak bu durumda tarayıcılar genellikle görmezden gelir, çünkü genellikle niyetin ne olduğunu bilmezler. Javascript uygulamanız bunu kullanabilir. JSON'un sunulacağını varsayıyorsunuz, böylece kodunu çözebilirsiniz JSON.parse(). Farklı bir işlem yapabilir veya yanlış contentType belirirse bir hatayı zorlayabilirsiniz.

1
Tarayıcı sizin için JSON metnini otomatik olarak ayrıştırmaz, bu yüzden response.texthala bir dizedir.
nnnnnn

1
Yani bana bu üstbilgiyi ayarlamanın hiç farketmediğini mi söylüyorsun? O zaman onun varoluşunun amacı nedir?
php_nub_qq

2
@php_nub_qq: Amacınız, sunucunuzun neyi döndürdüğünü söylemektir, böylece uygulamanız buna göre işleyebilir. Tarayıcı sizin için JSON ayrıştırmak olmaz, uygulamanız bunu gerekiyor. Bu başlık size bunun olduğunu (veya JSON olması gerektiğini) söylüyor.
Rocket Hazmat

Yanıtlar:


136

Content-TypeBaşlık sadece uygulama için bilgi olarak kullanılır. Tarayıcı ne olduğunu umursamıyor. Tarayıcı sadece AJAX çağrısından verileri döndürür. JSON olarak ayrıştırmak istiyorsanız, bunu kendi başınıza yapmanız gerekir.

Üstbilgi oradadır, böylece uygulamanız hangi verilerin döndürüldüğünü ve verilerin nasıl işlenmesi gerektiğini algılayabilir. Başlığa bakmanız gerekir ve eğer o application/jsonzaman JSON olarak ayrıştırın.

Aslında jQuery böyle çalışır. Sonuçla ne yapacağınızı söylemezseniz, bununla ne yapacağınızı Content-Typetespit etmek için kullanır .


12
Bu tamamen doğru değil. Eğer header('Content-Type: application/json');indirmeyi kullanmaz ve Content-Disposition: attachment; filename=myfile.jsonzorlamazsanız, sonunda bir myfile.json.html. Bu json başlığını kullanarak elde edersiniz myfile.json.
Remi Grumeau

4
@RemiGrumeau 'Tamamen doğru değil' nedir? Tarayıcı ile dosya indirmek tamamen farklı bir şey. Tarayıcı muhtemelen HTML'yi beklemek için varsayılan olacaktır, bu nedenle aldığı hiçbir şey aksi belirtilmedikçe HTML olduğunu varsayar. İndirirken .html, dosyaya eklenir , çünkü varsayılan olarak budur.
bzeaman

2
Burada sorunun tam içeriğini bilmiyorum - AMA, tarayıcılar (ve javascript) bazen Content-Type ile ilgileniyor. Bu üstbilgi, tarayıcının içeriği görüntülemek için kullandığı buluşsal yöntemleri etkileyebilir ve içerik türü metin / html ile XML ve JSON göndermek, genellikle temel XHR isteklerinde (veya bunların üstündeki katmanlarınızın katmanlarında) küçük hatalar oluşturabilir
Alan Storm

7

Content-Type: application/jsonyalnızca içerik başlığıdır. İçerik üstbilgisi yalnızca döndürülen verilerin türü hakkında bilgilerdir, örn .: JSON, resim (png, jpg, vb.), Html.

JavaScript'teki JSON'un bir dizi veya nesne olduğunu unutmayın. Tüm verileri görmek istiyorsanız uyarı yerine console.log dosyasını kullanın:

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

Orijinal JSON içeriğini dize olarak uyarmak istiyorsanız, tek tırnak işareti (') ekleyin:

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

Çift tırnak işareti kullanmayın. JavaScript, her bir değer ve anahtar için çift tırnak kullandığından JavaScript'i karıştırır:

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>

Bunu asla, tek tırnak kullanarak herhangi dizesi kıracak (ve birçok dilde sık var): echo "'" . json_encode(array('text' => 'it\'s wrong')) . "'"; Bu kırık çıktı üretecektir: '{"text":"it's wrong"}'. Bunu kullan: json_encode(json_encode(array('text' => 'it\'s good'))). Sonuç doğru şekilde "{\"text\":\"it's wrong\"}"
kaçacak

1

Aşağıdaki kod, ön taraftaki JavaScript için bir JSON nesnesi döndürmeme yardımcı oluyor

Şablon kodum

template_file.json

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

Python destekli kod

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 dosyası

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

Ön uç için jQuery kodu

  $.ajax({
        url:'{% url 'download_json-url' %}'        
    }).done(function(data){
        console.log('json ', data);
        console.log('Name', data.name);
        alert('hello ' + data.name);
    });
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.