[英]jQuery AJAX JSONP error “Unexpected token”
我正在嘗試在Chrome中進行跨域JSONP調用,但我不斷回復“Uncaught SyntaxError:Unexpected token:”我試過:更改響應內容類型,設置xhr標頭,JSON.stringify,幾乎大多數在這里提供的解決方案,但到目前為止沒有任何工作:-(
$.ajax({
type: "POST",
url: "https://www.virustotal.com/vtapi/v2/url/report",
crossDomain: true,
contentType: "application/json; charset=UTF-8",
dataType: 'jsonp',
data: {
apikey: "*",
resource: "http://www.1001freefonts.com/font/BaroqueScript.zip"
},
jsonp: false,
jsonpCallback: receive,
success: function (data, textStatus, jqXHR) {
console.log("Data retrieved: " + data);
}
}).done(function () {
console.log('I think we are done here');
})
.error(function (e) {
console.log(arguments);
console.log('something went funny here');
})
.complete(function (xhr, status) {
console.log("complete");
if (status === 'error' || !xhr.responseText) {
console.log('error');
}
else {
console.log("data found:" + xhr.responseText);
//...
}
});
});
function receive(saveData) {
if (saveData == null) {
console.log("DATA IS UNDEFINED!"); // displays every time
}
console.log("Success is " + saveData); // 'Success is undefined'
}
在調試器中,我可以看到響應
{"permalink": "https://www.virustotal.com/url/b5b546fdbb49a2258e951c5e568a52655c65ac56112e39d15af0954a53b36772/analysis/1360339512/", "url": "http://www.1001freefonts.com/font/BaroqueScript.zip", "response_code": 1, "scan_date": "2013-02-08 16:05:12", "scan_id": "b5b546fdbb49a2258e951c5e568a52655c65ac56112e39d15af0954a53b36772-1360339512", "verbose_msg": "Scan finished, scan information embedded in this object", "filescan_id": "b7e13c0242e9690aba1f3da4b73d9c2e99a9b7fd03f542b55e694a34aaf9eca8-1360339519", "positives": 0, "total": 35, "scans": {"CLEAN MX": {"detected": false, "result": "clean site"}, "MalwarePatrol": {"detected": false, "result": "clean site"}, "ZDB Zeus": {"detected": false, "result": "clean site"}, "K7AntiVirus": {"detected": false, "result": "clean site"}, "Quttera": {"detected": false, "result": "clean site"}, "Yandex Safebrowsing": {"detected": false, "result": "clean site"}, "MalwareDomainList": {"detected": false, "result": "clean site"}, "ZeusTracker": {"detected": false, "result": "clean site"}, "zvelo": {"detected": false, "result": "clean site"}, "Google Safebrowsing": {"detected": false, "result": "clean site"}, "BitDefender": {"detected": false, "result": "clean site"}, "Opera": {"detected": false, "result": "clean site"}, "G-Data": {"detected": false, "result": "clean site"}, "C-SIRT": {"detected": false, "result": "clean site"}, "Sucuri SiteCheck": {"detected": false, "result": "clean site"}, "VX Vault": {"detected": false, "result": "clean site"}, "ADMINUSLabs": {"detected": false, "result": "clean site"}, "SCUMWARE.org": {"detected": false, "result": "clean site"}, "Dr.Web": {"detected": false, "result": "clean site"}, "AlienVault": {"detected": false, "result": "clean site"}, "Malc0de Database": {"detected": false, "result": "clean site"}, "SpyEyeTracker": {"detected": false, "result": "clean site"}, "Phishtank": {"detected": false, "result": "clean site"}, "Avira": {"detected": false, "result": "clean site"}, "Antiy-AVL": {"detected": false, "result": "clean site"}, "Comodo Site Inspector": {"detected": false, "result": "clean site"}, "Malekal": {"detected": false, "result": "clean site"}, "ESET": {"detected": false, "result": "clean site"}, "SecureBrain": {"detected": false, "result": "unrated site"}, "Netcraft": {"detected": false, "result": "clean site"}, "ParetoLogic": {"detected": false, "result": "clean site"}, "URLQuery": {"detected": false, "result": "unrated site"}, "Wepawet": {"detected": false, "result": "unrated site"}, "Minotaur": {"detected": false, "result": "clean site"}}}
我已經在http://jsonlint.com/上驗證了它,它表明它是一個有效的JSON。
這是響應標題
cache-control:no-cache
content-encoding:gzip
content-length:695
content-type:application/json
date:Wed, 13 Feb 2013 12:00:33 GMT
server:Google Frontend
status:200 OK
vary:Accept-Encoding
version:HTTP/1.1
任何人有任何想法/建議?
在徹底測試之后,很明顯當ajax期望JSONP作為回報時(由於跨域限制),不可能捕獲JSON對象結果。 即使響應狀態= 200。
我一直在測試使用jQuery AJAX調用,試圖看看結果是否仍然可以捕獲 - 盡管瀏覽器拋出了解析錯誤 - 但它似乎不可能。 看起來響應文本在JS工作完成后到達標題。
正如@Florian F. @Likwid_T @Christoph上面所建議的那樣,一定要使用服務器端腳本才能使其正常工作。 其他開發人員似乎熱衷於使用C#編寫的代理作為解決方案。
JSONP無法開箱即用。
JSONP通過在script標記中加載結果來繞過跨域限制。
基本上,您的服務器必須支持JSONP。
在發送響應之前,在服務器端執行任何需要執行的操作:
PHP中的代碼示例:
$responseString = '{"smthing":"val","smthingelse":"val2"}';
if (isset($_REQUEST['_callback'])) {
$responseString = $_REQUEST['_callback'] . '(' . $responseString . ');';
}
它將使用正確的參數執行你的'done'匿名函數。 (JQuery處理其他所有事情)
Christoph是對的,你需要在你的回調函數中包含你的答案,在你的情況下在PHP文件的末尾:
echo $_GET['receive'] . '(' . json_encode($yourResultObject) . ');';
或者如果你需要一個更復雜的對象
echo $_GET['receive'] . '(' . json_encode(array(name1 => object1, name2 => object2, name3 => object3)) . ');';
你可能需要調整一下,但基本上每當我得到Unexpected令牌幾乎總是一個語法錯誤,使得jQuery沒有得到我的回調函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.