【发布时间】:2016-08-08 13:18:33
【问题描述】:
我正在使用 jQuery AJAX 对 Web 服务进行查询。我的查询如下所示:
var serviceEndpoint = 'http://example.com/object/details?version=1.1';
$.ajax({
type: 'GET',
url: serviceEndpoint,
dataType: 'jsonp',
contentType: 'jsonp',
headers: { 'api-key':'myKey' },
success: onSuccess,
error: onFailure
});
执行此操作时,我收到状态错误 403。我不明白为什么我的调用会导致状态代码为 403。我控制着我的服务的安全性,它被标记为完全开放.我知道密钥是有效的,因为我在另一个调用中使用它,它有效。这是有效的调用:
var endpoint = 'http://example.com/object/data/item?version=1.1';
$.ajax({
type: 'POST',
url: endpoint,
cache: 'false',
contentType:'application/json',
headers: {
'api-key':'myKey',
'Content-Type':'application/json'
},
data: JSON.stringify({
id: 5,
count:true
}),
success: onDataSuccess,
error: onDataFailure
});
我知道这是两个不同的端点。但我 100% 确信这不是服务器端身份验证或权限错误。再一次,服务器端的一切都是开放的。这意味着我在客户端请求上犯了一些错误。
我觉得我应该传达这个请求是在开发过程中提出的。所以,我从http://localhost:3000 运行这个。出于这个原因,我立即认为这是一个 CORS 问题。但一切看起来都是正确的。我的 POST 请求有效,但我的 GET 并没有让我感到非常沮丧。我错过了什么吗?会是什么?
【问题讨论】:
-
您是否尝试过直接在浏览器中打开该网址?您是否错过了网址的
/data/部分以匹配有效的部分? -
请注意,
jsonp请求不能发送标头,它是脚本请求。您确定要jsonp而不是json?还有为什么JSON.stringify()用于标题? GET 没有请求contentType。因为没有发送正文内容。你有很多问题,其中任何一个都可能是问题 -
@charlietfl 我确实尝试在浏览器中打开。我不熟悉我需要包含的任何
/data/部分。我几乎只需要传递version和api-key。我认为我应该将api-key作为标题。我是否需要将data和contentType属性设置为jsonp?这似乎应该是一个简单的调用。但很明显,我搞砸了,忽略了一些东西。正确的调用应该是什么样的? -
jsonp 是一种不同于 ajax 的请求类型,并且不允许标头。从所显示的内容中对问题的了解还不够
-
你在用chrome吗?你的后端技术是什么?
标签: jquery ajax cors http-status-code-403