Javascript jqueryajaxjsonp错误;意外标记“;
我试图在Chrome中调用跨域的JSONP,但是我不断地返回“未捕获的SyntaxError:意外标记:” 我尝试过:更改响应内容类型,设置xhr标题,JSON.stringify,这里提供的大部分解决方案都是这样,但到目前为止都没有效果:-( 在调试器中,我可以看到响应Javascript jqueryajaxjsonp错误;意外标记“;,javascript,jquery,ajax,xmlhttprequest,jsonp,Javascript,Jquery,Ajax,Xmlhttprequest,Jsonp,我试图在Chrome中调用跨域的JSONP,但是我不断地返回“未捕获的SyntaxError:意外标记:” 我尝试过:更改响应内容类型,设置xhr标题,JSON.stringify,这里提供的大部分解决方案都是这样,但到目前为止都没有效果:-( 在调试器中,我可以看到响应 {"permalink": "https://www.virustotal.com/url/b5b546fdbb49a2258e951c5e568a52655c65ac56112e39d15af0954a53b36772/an
{"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"}}}
我已经在上验证了它,它表明它是一个有效的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
有人有什么想法/建议吗?JSONP不是现成的 JSONP通过将结果加载到脚本标记中绕过跨域限制 基本上,服务器必须启用JSONP 在发送响应之前,在服务器端执行任何需要执行的操作:
$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)) . ');';
您可能需要稍作调整,但基本上每当我获得意外标记时,几乎总是一个语法错误,使得jQuery无法获得回调函数。经过彻底测试后,很明显,当ajax需要JSONP作为回报时,不可能捕获JSON对象结果(由于跨域限制)。即使响应状态为200 我一直在使用jQuery AJAX调用进行测试,试图看看结果是否仍然可以被捕获——尽管浏览器抛出了解析错误——但这似乎不可能。看起来,响应文本在JS工作完成后到达标题中
正如@Florian F.@Likwid_T@Christoph在上文中所建议的那样,服务器端脚本是确保其正常工作所必需的。其他开发人员似乎热衷于使用C#编写的代理作为解决方案。对于JSONP,您需要一个functionwrapper。简单的JSON对象不是有效的JSONP响应。服务器实际上能够为JSONP服务吗-响应?同样
dataType:'jsonp',jsonp:false
看起来不正确。@Christoph RedataType:'jsonp',jsonp:false
它们是正确的,在进一步检查之后,查看@Christoph上的文档,服务器似乎只能发回JSON,而不能发回jsonp。我需要找出转换响应的方法。进一步解释对于读者来说,JSON头是content-type:application/JSON
JSONP头应该是这样的content-type:application/javascript
,我认为他对服务器端没有控制权。否则在大多数情况下,你不必做跨域请求。@Likwid\u不幸的是,没有服务器端脚本可以参与。它必须重新启动main JS。是否可以在JS中应用相同的操作?我的回调函数没有接收到数据,即使我可以在响应头中看到返回的JSON对象结果。等等,我只是重新读取:您在响应中从服务器获取数据?{“permalink”:“…等等?是否正确?如果您控制台.log(数据[”)永久链接“]);你怎么想,他可以修改服务器?如果他在做跨域请求,很可能他没有控制。因为这是目前唯一的解决方案。只有当你控制服务器或服务器本身接受它时,跨域才有用。下一个解决方案是在你自己的域上构建一个代理,将请求转发到Web服务。@Florian.Christoph是对的,我对服务器没有控制权。我的项目仅限于JS。@Eric那么在你自己的服务器上设置代理怎么样?@Florian。这会让生活更轻松,不幸的是,代码必须作为扩展运行。都是JS。
echo $_GET['receive'] . '(' . json_encode(array(name1 => object1, name2 => object2, name3 => object3)) . ');';