我正在使用返回JSON数据的Web服务。
test.com/incident.do?JSON&sysparm_action=getRecords
在浏览器中加载此URL会提示我打开incident.do,它在记事本中打开显示有效的JSON数据。
然后,在同一个域的网页中,我使用了这个:
$.ajax({
beforeSend: function(xhr) {
xhr.setRequestHeader('Authorization', authinfo);
},
url: "https://test.com/incident.do?JSON&sysparm_action=getRecords",
dataType: 'json',
type: 'GET',
success: function(a,b,c) {
alert(a);
}
});
但是,使用此代码我没有收到任何JSON,我只收到此回复
HTTP/1.1 200 OK
Date: Tue, 13 Jul 2010 22:28:09 GMT
Server: Apache-Coyote/1.1
Allow: GET, HEAD, POST, TRACE, OPTIONS
Content-Length: 0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/plain
我在这里做错了什么?
编辑:如果它对任何人有帮助,我在提供商的网站上有一个提供相同功能的沙箱的链接...用户名/密码是admin / admin
https://demo.service-now.com/incident.do?JSON&sysparm_action=getRecords
答案 0 :(得分:0)
尝试设置contentType
$.ajax({
beforeSend: function(xhr) {
xhr.setRequestHeader('Authorization', authinfo);
},
url: "https://test.com/incident.do?JSON&sysparm_action=getRecords",
contentType: "application/json",
dataType: 'json',
type: 'GET',
success: function(a,b,c) {
alert(a);
}
});
<强>更新强>
这是正确的通话方式。但是,如果您向域外的页面发出请求,则无法使用。为此你需要一个代理。 这是一个简单的PHP代理:
<?php
/* Set the headers for application/json , xml, or whatever */
echo @file_get_contents(urldecode($_GET['url']));
?>
然后您的请求必须是这样的页面,如下所示:
$.ajax({
beforeSend: function(xhr) {
xhr.setRequestHeader('Authorization', authinfo);
},
url: "myproxy.php?url=" + escape("https://test.com/incident.do?JSON&sysparm_action=getRecords"),
contentType: "application/json",
dataType: 'json',
type: 'GET',
success: function(a,b,c) {
alert(a);
}
});
答案 1 :(得分:0)
尝试删除 "type": "GET"
。 jQuery Ajax请求默认为GET。
也许您会遇到浏览器XSS限制。网页也是通过HTTPS提供的吗?如果包含ajax调用的页面是HTTP并且AJAX端点是HTTPS,则它将违反相同的源策略。更多讨论here。
来自jQuery doco:
由于浏览器安全限制, 大多数“Ajax”请求都受制于 同源政策;请求 无法成功检索数据 来自不同的域,子域或 协议
根据wikipedia,http://test.com和https://test.com起源不同,因此违反了相同的原始政策。尝试将您的网页设为HTTPS。
$.ajax({
beforeSend: function(xhr) {
xhr.setRequestHeader('Authorization', authinfo);
},
url: "https://test.com/incident.do?JSON&sysparm_action=getRecords",
dataType: 'json',
success: function(a,b,c) {
alert(a);
}
});