JavaScript: 解析来自 GitHub API 的 JSONP 回调响应
JavaScript: parsing JSONP callback response from GitHub API
我正在创建一个调用 GitHub API 的 Express 路由,并在端点添加了 ?callback=foo
模式,这样它将 return Link headers 我需要解析出 Link:
header 因为它包含 link 我必须调用它来获取下一页回复。
问题是响应具有预期的模式,但是当我尝试创建一个函数来梳理函数的 meta
和 data
部分时,它们未定义。
我的代码:
app.get('/populate', function(req, res, next) {
console.log('/populate route hit');
var token = "<something>";
var options = {
url: 'https://api.github.com/users?callback=resp',
headers: {
'User-Agent': 'Our-App',
'Authorization': 'token '+ token
}
};
api(options) // 'api' is request-promise module, makes http requests
.then(function(response) {
console.log(response); // Note 1
function resp(res) {
var meta = res.meta;
var data = res.data;
console.log('meta ', meta); // Note 2
console.log('data ', data);
}
resp(response);
注释 1:响应如下所示:
/**/resp({"meta":{"X-RateLimit-Limit":"5000","X-RateLimit-Remaining":"4993",
"X-RateLimit-Reset":"1435297775","X-OAuth-Scopes":"public_repo, user:email",
"X-Accepted-OAuth-Scopes":"repo","Cache-Control":"private, max-age=60, s-maxage=60",
"Vary":"Accept, Authorization, Cookie, X-GitHub-OTP",
"ETag":"\"0cbbd180648a54f839a237b0302025db\"",
"X-GitHub-Media-Type":"github.v3; format=json",
"Link":[["https://api.github.com/users?callback=resp&since=46",
{"rel":"next"}],["https://api.github.com/users{?since}",
{"rel":"first"}]],"status":200},"data":[{"login":"mojombo","id":1,
...etc etc...
}]})
响应看起来像是 JSON.stringified 但是当我 JSON.parse(response)
它 return 是一个错误。我不知道如何访问 deeply-embedded Link:
header 甚至 data
,它看起来也像 JSON。
注 2 res.meta 和 res.data 记录为 undefined.
响应不是 JSON,而是 JSONP. JSONP is a cross-domain mechanism for retrieving data. You don't use XHR (e.g., app.get
) to request JSONP, you use a script
tag. (Because XHR is limited by the Same Origin Policy; script
标签不是。)
如果您通过 XHR 检索该数据的调用有效,则意味着在您的情况下允许跨域 XHR 调用(服务器支持 Cross-Origin Resource Sharing 页面来源,并且浏览器支持 CORS)。您可以通过删除 URL.
中的 ?callback=resp
来获得 JSON 而不是 JSONP
我正在创建一个调用 GitHub API 的 Express 路由,并在端点添加了 ?callback=foo
模式,这样它将 return Link headers 我需要解析出 Link:
header 因为它包含 link 我必须调用它来获取下一页回复。
问题是响应具有预期的模式,但是当我尝试创建一个函数来梳理函数的 meta
和 data
部分时,它们未定义。
我的代码:
app.get('/populate', function(req, res, next) {
console.log('/populate route hit');
var token = "<something>";
var options = {
url: 'https://api.github.com/users?callback=resp',
headers: {
'User-Agent': 'Our-App',
'Authorization': 'token '+ token
}
};
api(options) // 'api' is request-promise module, makes http requests
.then(function(response) {
console.log(response); // Note 1
function resp(res) {
var meta = res.meta;
var data = res.data;
console.log('meta ', meta); // Note 2
console.log('data ', data);
}
resp(response);
注释 1:响应如下所示:
/**/resp({"meta":{"X-RateLimit-Limit":"5000","X-RateLimit-Remaining":"4993",
"X-RateLimit-Reset":"1435297775","X-OAuth-Scopes":"public_repo, user:email",
"X-Accepted-OAuth-Scopes":"repo","Cache-Control":"private, max-age=60, s-maxage=60",
"Vary":"Accept, Authorization, Cookie, X-GitHub-OTP",
"ETag":"\"0cbbd180648a54f839a237b0302025db\"",
"X-GitHub-Media-Type":"github.v3; format=json",
"Link":[["https://api.github.com/users?callback=resp&since=46",
{"rel":"next"}],["https://api.github.com/users{?since}",
{"rel":"first"}]],"status":200},"data":[{"login":"mojombo","id":1,
...etc etc...
}]})
响应看起来像是 JSON.stringified 但是当我 JSON.parse(response)
它 return 是一个错误。我不知道如何访问 deeply-embedded Link:
header 甚至 data
,它看起来也像 JSON。
注 2 res.meta 和 res.data 记录为 undefined.
响应不是 JSON,而是 JSONP. JSONP is a cross-domain mechanism for retrieving data. You don't use XHR (e.g., app.get
) to request JSONP, you use a script
tag. (Because XHR is limited by the Same Origin Policy; script
标签不是。)
如果您通过 XHR 检索该数据的调用有效,则意味着在您的情况下允许跨域 XHR 调用(服务器支持 Cross-Origin Resource Sharing 页面来源,并且浏览器支持 CORS)。您可以通过删除 URL.
中的?callback=resp
来获得 JSON 而不是 JSONP