angular.js - AngularJS menggunakan kaedah $http.jsonp untuk meminta data secara tidak betul merentas domain
巴扎黑
巴扎黑 2017-05-15 16:54:25
0
8
743

Saya tahu apa itu AngularJS sebelum ini, tetapi saya baru mula mencuba hari ini dan menghadapi masalah ini.

Kod adalah seperti berikut:

$http.jsonp("https://request.address.json?callback=JSON_CALLBACK")
    .success(
        function(data, status, header, config){
            $scope.list = data;
            alert(data);
        }
    )
    .error(
        function(data){
            alert("error");
        }
    );

Selepas mengakses, anda boleh melihat bahawa kod status yang dikembalikan ialah 200 melalui alat pembangun penyemak imbas, dan anda boleh melihat rentetan json yang dikembalikan, tetapi selepas pelaksanaan, kaedah error sentiasa saya cari untuk masa yang lama saya tidak dapat mencari penyelesaian, adakah pakar yang boleh memberi saya jawapan?

巴扎黑
巴扎黑

membalas semua(8)
巴扎黑

Di bahagian pelanggan, dokumentasi rasmi menjadikannya sangat jelas“URL relatif atau mutlak yang menentukan destinasi permintaan Nama panggilan balik hendaklah rentetan JSON_CALLBACK.”Di bahagian pelayan, get Parameter panggil balik adalah seperti angular.callbacks._0 dikira mengikut sudut pada sisi klien (angular akan mengira dan mengemas kini nilai medan panggil balik berdasarkan bilangan permintaan daripada klien sebelum menghantar), dan pelayan menerima panggilan balik Selepas medan, hanya kembalikannya sebagai rentetan 'angular.callbacks._0({json data})', contohnya:

<?php
$callback = $_GET['callback'];
$response = array('code'=>200, 'data'=>'success');

$json = json_encode($response);
echo "$callback($json)";
漂亮男人

Siarkan json yang dikembalikan dan lihat

迷茫

Antara muka belakang perlu melakukan pemprosesan khas untuk permintaan jsonp. Permintaan membawa parameter panggil balik:

Pemulangan mestilah sekeping kod JavaScript:

angular.callbacks._0({
    "longitude": 120.1614,
    "latitude": 30.2936,
    "asn": "AS4837",
    "offset": "8",
    "ip": "60.12.58.161",
    "area_code": "0",
    "continent_code": "AS",
    "dma_code": "0",
    "city": "Hangzhou",
    "timezone": "Asia\/Shanghai",
    "region": "Zhejiang",
    "country_code": "CN",
    "isp": "CNCGROUP China169 Backbone",
    "country": "China",
    "country_code3": "CHN",
    "region_code": "02"
});

Ini berkaitan dengan fakta bahawa JSONP boleh merentas domain menggunakan tag skrip sebagai pembawa permintaan manakala Ajax menggunakan objek XHR.

習慣沉默

Kandungan yang dikembalikan ditukar kepada:

JSON_CALLBACK({
    "longitude": 120.1614,
    "latitude": 30.2936,
    "asn": "AS4837",
    "offset": "8",
    "ip": "60.12.58.161",
    "area_code": "0",
    "continent_code": "AS",
    "dma_code": "0",
    "city": "Hangzhou",
    "timezone": "Asia\/Shanghai",
    "region": "Zhejiang",
    "country_code": "CN",
    "isp": "CNCGROUP China169 Backbone",
    "country": "China",
    "country_code3": "CHN",
    "region_code": "02"
})

Cubalah?

左手右手慢动作

jsonp(url,[config]) hanya boleh memproses hasil dalam format JSONP (JSON != JSONP Jika data yang anda kembalikan dalam format JSON, jsonp() tidak boleh menghuraikannya dan akan melaporkan ralat.

过去多啦不再A梦

Parameternya ialah panggil balik=JSON_CALLBACK, sudut akan menggantikan JSON_CALLBACK anda secara automatik dan menetapkan Nama panggilan balik untuk anda.
Anda boleh meminta data, tetapi anda tidak boleh memasuki sccess kerana panggilan balik yang ditetapkan mengikut sudut untuk anda tidak dicetuskan. Saya rasa ini adalah sedikit perangkap. Ia tidak mesra pengguna seperti reka bentuk jQuery

小葫芦

Adakah poster asal telah menyelesaikannya? Saya juga menghadapi masalah yang sama seperti anda. Saya boleh mencapai kejayaan seperti biasa pada penyemak imbas, tetapi apabila menyahpepijat pada telefon mudah alih saya, saya sentiasa mendapat ralat, data=undefined status: 404

巴扎黑

Adakah poster asal telah menyelesaikannya? Saya juga mengalami masalah yang sama seperti anda.
Paparan konsol: JSON_CALLBACK tidak ditakrifkan

$http.jsonp('http://m-static.igrow.cn/01tpl/json/data.json?callback=JSON_CALLBACK');
//Tambah ini untuk melaraskan data, tetapi rasanya pelik.
tetingkap.JSON_CALLBACK = fungsi(data) {

console.log(data);

};

Bagaimana jika saya perlu melakukan perkara lain apabila mengembalikan ralat?

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan