注意:我没有足够的声誉来发布所有链接,所以我只是删除了第一个字母,以便文本编辑器不会将其视为链接。要找到他们,只需将其粘贴到您的地址栏中并在前面添加一个 h。
我正在尝试使用可汗学院的 API 访问用户数据,但是,这是我第一次使用他们的 API 或 AJAX。到目前为止,我已经成功地检索了有关视频或练习的数据,但是在使用 OAuth 检索用户数据时遇到了麻烦。这是可汗学院授权的信息。他们使用 OAuth 1.0。这是我正在使用的 OAuth 库。这是 KA API 的文档:http: //api-explorer.khanacademy.org/我试过了:
var oauth = OAuth({
consumer: {
public: '****************',
secret: '****************'
},
signature_method: 'HMAC-SHA1'
});
var request_data = {
url: 'http://www.khanacademy.org/api/v1/exercises/logarithms_1',
method: 'GET'
};
$.ajax({
url: request_data.url,
type: request_data.method,
headers: oauth.toHeader(oauth.authorize(request_data))
}).done(function(data) {
alert("done");
});
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>KA API Test</title>
<meta http-equiv="Access-Control-Allow-Origin" content="*">
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<meta name="generator" content="Geany 1.23.1" />
<!-- sha1 -->
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/hmac-sha1.js"></script>
<!-- sha256 -->
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/hmac-sha256.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/components/enc-base64-min.js"></script>
<script src="oauth-1.0a.js"></script>
<script src="jquery-1.12.0.min.js"></script>
</head>
<body>
</body>
</html>
我也用相同的 HTML 尝试过这个 Javascript:
var oauth = OAuth({
consumer: {
public: 'qdMdMjjJQKrwJw2S',
secret: '7XeknfpVBzx8fGMK'
},
signature_method: 'HMAC-SHA1'
});
var request_data = {
url: 'http://www.khanacademy.org/api/v1/exercises/logarithms_1',
method: 'GET'
};
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://www.khanacademy.org/api/v1/exercises/logarithms_1", true);
xhr.setRequestHeader("Authorization", oauth.toHeader(oauth.authorize(request_data)));
xhr.send();
xhr.addEventListener("readystatechange", processRequest, false);
function processRequest(e) {
if (xhr.readyState == 4 && xhr.status == 200) {
var response = JSON.parse(xhr.responseText);
for (var key in response) {
console.log(key + ":" + response[key]);
}
alert(response.translated_description_html);
}
}
两者都在控制台中给出了这个错误:“XMLHttpRequest cannot load http://www.khanacademy.org/api/v1/exercises/logarithms_1。对预检请求的响应没有通过访问控制检查:没有'Access-Control-Allow-请求的资源上存在 Origin 标头。因此不允许访问Origin ' http://localhost '。
注意: XMLHttpRequest 工作正常,并在添加之前返回我想要xhr.setRequestHeader("Authorization", "OAuth " + oauth.toHeader(oauth.authorize(request_data)));
的内容。但是,这只是一个不需要授权的测试链接,我稍后会更改它。
PS我想修复这个错误,但我也只需要正确使用OAuth,我认为它们是相关的,因为在使用OAuth之前我没有错误。