Angular 使用 hapi js 服务器 jsonp
Angular with hapi js server jsonp
我在 /api/profile
定义了一个端点,它接受 post 个参数。
var http = require('http');
var serverConfig = require('../server.config.js');
var request = require('request');
module.exports = function(server){
server.route({
method: 'POST',
path: '/api/profile',
handler: getProfileData
});
function getProfileData(request, reply){
var battleTag = request.payload.battleTag;
getProfileDataHttp(battleTag, function(err, data){
if(err){
reply(new Error(err));
}
reply(data);
});
}
function getProfileDataHttp(battleTag, callback){
var key = serverConfig.battleNet.apiKey;
var tag = encodeURIComponent(battleTag);
var url = 'https://eu.api.battle.net/d3/profile/'+ tag + '/?locale=en_GB&callback=JSON_CALLBACK&apikey=' + key;
console.log(url);
request(url,function(error, response, body){
if(error){
callback(err);
}
if(!error && response.statusCode ==200){
callback(null, body);
}
});
}
};
它正在调用带有 json 回调的 api,当我收到数据时,它的格式为:
JSON_CALLBACK({ json data here})
我怎样才能让这个端点到 return 只有 json 数据,我试过 JSON.parse()
但它会导致服务器出错。
调用此端点的 angular 服务如下所示:
function getProfileData(battleTag){
var defer = $q.defer();
var tag = validTag(battleTag);
if(!tag){
defer.reject('Invalid Tag please use format 1[a-z]11[a-z0-9]#4[0-9]');
return defer.promise;
}
$http.post('/api/profile', {
battleTag: battleTag
})
.success(function(data){
if(data.reason){
defer.resolve(data.reason);
}
defer.resolve(data);
})
.error(function(err){
defer.reject(err);
});
return defer.promise;
}
在 angular 中使用 $http.jsonp 时该调用会起作用,但是我必须创建服务器以对客户端隐藏密钥
你的问题有点令人费解。你说的是JSONP,但是你想直接获取数据。
JSONP 的全部意义在于 return 将数据封装在您选择的函数中。然后你只需执行它。
如果您想要直接获取数据,请不要使用 JSONP。只需拨打 "normal" 电话即可。
快速浏览了 Battle.net API 之后,似乎要直接获取数据,您只需在请求的 URL 中省略 'callback' 参数即可。
因此,您的请求 URL 将如下所示:
var url = 'https://eu.api.battle.net/d3/profile/'+ tag + '/?locale=en_GB&apikey=' + key;
我在 /api/profile
定义了一个端点,它接受 post 个参数。
var http = require('http');
var serverConfig = require('../server.config.js');
var request = require('request');
module.exports = function(server){
server.route({
method: 'POST',
path: '/api/profile',
handler: getProfileData
});
function getProfileData(request, reply){
var battleTag = request.payload.battleTag;
getProfileDataHttp(battleTag, function(err, data){
if(err){
reply(new Error(err));
}
reply(data);
});
}
function getProfileDataHttp(battleTag, callback){
var key = serverConfig.battleNet.apiKey;
var tag = encodeURIComponent(battleTag);
var url = 'https://eu.api.battle.net/d3/profile/'+ tag + '/?locale=en_GB&callback=JSON_CALLBACK&apikey=' + key;
console.log(url);
request(url,function(error, response, body){
if(error){
callback(err);
}
if(!error && response.statusCode ==200){
callback(null, body);
}
});
}
};
它正在调用带有 json 回调的 api,当我收到数据时,它的格式为:
JSON_CALLBACK({ json data here})
我怎样才能让这个端点到 return 只有 json 数据,我试过 JSON.parse()
但它会导致服务器出错。
调用此端点的 angular 服务如下所示:
function getProfileData(battleTag){
var defer = $q.defer();
var tag = validTag(battleTag);
if(!tag){
defer.reject('Invalid Tag please use format 1[a-z]11[a-z0-9]#4[0-9]');
return defer.promise;
}
$http.post('/api/profile', {
battleTag: battleTag
})
.success(function(data){
if(data.reason){
defer.resolve(data.reason);
}
defer.resolve(data);
})
.error(function(err){
defer.reject(err);
});
return defer.promise;
}
在 angular 中使用 $http.jsonp 时该调用会起作用,但是我必须创建服务器以对客户端隐藏密钥
你的问题有点令人费解。你说的是JSONP,但是你想直接获取数据。
JSONP 的全部意义在于 return 将数据封装在您选择的函数中。然后你只需执行它。
如果您想要直接获取数据,请不要使用 JSONP。只需拨打 "normal" 电话即可。
快速浏览了 Battle.net API 之后,似乎要直接获取数据,您只需在请求的 URL 中省略 'callback' 参数即可。
因此,您的请求 URL 将如下所示:
var url = 'https://eu.api.battle.net/d3/profile/'+ tag + '/?locale=en_GB&apikey=' + key;