[英]Adding headers to ajax request fails
这似乎非常简单,但我无法将额外的 HTTP 标头添加到我尝试发出的请求中。 我通过浏览器开发人员工具以及 BurpSuite 观看过。 我正在使用 JSONP,因为这是一个跨站点调用,但这无关紧要。 我很难过,正在寻找一些指导。
我需要在我从第三方 Rest API 发出的请求的 header 中添加一个令牌/值以进行身份验证。 为了调试目的,我已将代码剥离到示例页面中。 这是我正在使用的示例:
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
function getData() {
$.ajax({
type: "GET",
url: "https://<somesite>.com/<path>",
accept: "application/json",
dataType: "jsonp",
crossDomain: true,
beforeSend: function (xhr) {
xhr.setRequestHeader("Accept", "application/json");
xhr.setRequestHeader("x-token","<token value>");
},
data: {
select: "timeZoneId"
},
success: function (data, status) {
debugger;
alert("Sucess");
},
error: function (xhr, status, error) {
debugger;
alert("Error! :" + xhr.status);
}
});
}
</script>
</head>
<body>
<button type="button" onclick="getData()">Submit</button>
</body>
</html>
我经历了各种扭曲,将 x-token 添加为 header,但它从未被添加到请求中,我可以看到。 请求的结果始终是 401 未授权错误,如果传递了无效/缺失的 x-token,这是预期的错误。 正如我所提到的,对标头的检查不会显示 x-token。
我看到的标题是:
GET /redzone/public/bi/v_completeddataitem?callback=jQuery36009809687059838048_1648150351509&select=timeZoneId&_=1648150351510 HTTP/2
Host: <somesite>.com
Cookie: AWSALBCORS=f+1AWICQyRddSBjj6CNFH6f6XAnVjPOqAMq1JcPj9CCN1x1Izv1cFFXFKo7IKop53Lw4Y95mWWRjzHRAtOwTGccbwbvS8DBCDxJZY8WA9dEwu2Z/XKPeiSV+rAsb
Sec-Ch-Ua: "(Not(A:Brand";v="8", "Chromium";v="99"
Sec-Ch-Ua-Mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36
Sec-Ch-Ua-Platform: "Windows"
Accept: */*
Sec-Fetch-Site: cross-site
Sec-Fetch-Mode: no-cors
Sec-Fetch-Dest: script
Referer: http://localhost/
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
在此先感谢您的任何建议。
JSONP 通过注入一个带有src
属性的<script>
元素来工作。
无法在<script>
元素上设置请求标头。
这是 JSONP 的众多限制之一。
使用 XMLHttpRequest 或 fetch 来请求 JSON 和 CORS。
您设置的标头之一是Accept: application/json
这没有意义,因为您可以使用 JSONP 解析的唯一数据格式是 JSONP(它是text/javascript
的子集)。
我有一种预感,问题是第三方不支持跨源请求,而您正试图通过使用 JSONP 来破解它。 这是行不通的,因为 JSONP 要求它们明确支持 JSONP(就像现代跨源请求要求它们明确支持 CORS 一样)。
如果第三方不支持跨源请求,那么你需要从浏览器以外的地方发出请求。 例如通过您自己的服务器代理它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.