Pertanyaan Permintaan JSONP mengembalikan kesalahan: "SyntaxError: Syndax: Unexpected token:".


Jadi saya mencoba mengajukan permintaan ke Stack Exchange API dengan kode jQuery berikut:

$.ajax({                                                                                                                                                                                                        
    type: 'POST',                                                                                                                                                                                                 
    url: 'http://api.stackoverflow.com/1.1/stats',                                                                                                                                              
    dataType: 'jsonp',                                                                                                                                                                                                
    success: function() { console.log('Success!'); },                                                                                                                                                                                       
    error: function() { console.log('Uh Oh!'); }                                                                                                                                                              
});   

Tetapi ketika saya membuka file di komputer saya, baik di FireFox atau Chrome, dan membuat permintaan, saya mendapatkan kesalahan ini:

Resource interpreted as Script but transferred with MIME type application/json.
Uncaught SyntaxError: Unexpected token :
Uh Oh!

Saya tidak tahu apa yang terjadi. Saya tahu Stack Exchange API Gzips tanggapannya, apakah ini akan menimbulkan masalah?


25
2018-05-18 14:03


asal


Jawaban:


Anda harus menetapkan parameter yang tidak biasa untuk membuat API SO bekerja. Daripada yang konvensional callback, Anda harus lulus jsonp parameter.

Selanjutnya, Anda tidak bisa melakukannya POST dengan JSONP.

$.ajax({                                                                                                                                                                                                        
    type: 'GET',                                                                                                                                                                                                 
    url: 'http://api.stackoverflow.com/1.1/stats',                                                                                                                                              
    dataType: 'jsonp',                                                                                                                                                                                                
    success: function() { console.log('Success!'); },                                                                                                                                                                                       
    error: function() { console.log('Uh Oh!'); },
    jsonp: 'jsonp'                                                                                                                                                
});

Tidak mungkin melakukan AJAX lintas-domain menggunakan XMLHTTPRequest konvensional. Ini untuk alasan keamanan (ini disebut kebijakan asal-sama).

Ada solusi. script tag tidak tunduk pada pembatasan ini. Ini berarti Anda dapat memasukkan script tag ke dalam dokumen yang memanggil URL. Jika Anda mendefinisikan fungsi yang dapat diakses secara global dalam skrip Anda dan memberi tahu server jarak jauh fungsi apa yang dipanggil, server dapat meneruskan kode yang membungkus data yang akan dikirim dalam panggilan ke fungsi itu.

Kesulitan yang Anda miliki di sini adalah dengan API StackOverflow. Secara konvensional, Anda akan menggunakan callback argumen dalam permintaan Anda, untuk memberi tahu server apa fungsi Anda dipanggil. Namun, API StackOverflow meminta Anda untuk menggunakan jsonp sebagai gantinya.


21
2018-05-18 14:11



Coba URL ini: http://api.stackoverflow.com/1.1/stats?jsonp=callme

"callme" adalah nama fungsi callback Anda - di NAMA GLOBAL Anda (objek jendela).

By the way, jika Anda menjalankan Firefox dan menginstal JSONView add-on Anda dapat menguji URL di atas (dan Anda untuk perbandingan) secara langsung.

Hasil dari memanggil URL:

callme({
  "statistics": [
...
  ]
})

4
2018-05-18 14:12