我正在尝试将骨干用于本地项目,该项目永远不会看到真正的Web服务器,并且通过AJAX与Yelp API进行交互。 Yelp API要求我们使用oauth进行身份验证,并提供sample code之后我已经建模自己的代码。当我使用示例代码时,我不会遇到Cross-Origin或其他任何问题。但是,当我关闭浏览器安全选项时,我只会得到400响应错误。
我曾尝试覆盖fetch方法,如下所示:
fetch: function(options) {
var accessor, message, parameterMap, parameters;
if (!options) {
options = {};
}
accessor = {
consumerSecret: LOAF.auth.conserumerSecret,
tokenSecret: LOAF.auth.accessTokenSecret
};
parameters = [];
parameters.push(['oauth_consumer_key', LOAF.auth.consumerKey]);
parameters.push(['oauth_consumer_secret', LOAF.auth.consumerSecret]);
parameters.push(['oauth_token', LOAF.auth.accessToken]);
parameters.push(['oauth_signature_method', 'HMAC-SHA1']);
parameters.push(['location', "New York City"]);
message = {
'action': this.url,
'method': 'GET',
'parameters': parameters
};
OAuth.setTimestampAndNonce(message);
OAuth.SignatureMethod.sign(message, accessor);
parameterMap = OAuth.getParameterMap(message.parameters);
parameterMap.oauth_signature = OAuth.percentEncode(parameterMap.oauth_signature);
options.url = this.url;
options.data = parameterMap;
options.cache = true;
options.dataType = 'json';
options.success = this.onResponse;
console.log("Attempting");
console.log(options);
return Backbone.Model.prototype.fetch.apply(this, options);
},
但这会产生400响应。我有一种感觉,因为我没有正确地调用AJAX,因为主干为我做了大部分工作,并且可能会覆盖我正在设置的一些选项。我认为我需要做的是覆盖这个集合的“同步”方法,而不是只处理OAuth并自己解析响应。有更好的方法吗?
答案 0 :(得分:1)
我不确定这是否是正确的做事方式,但它是这样的,所以这是我的解决方案。我重写了fetch,从不调用默认的fetch方法。相反,我在fetch方法中进行ajax调用,并使用onResponse
方法处理响应,为响应创建模型(Yelp Businesses)。希望这有助于任何处于相同位置的人。
LOAF.YelpList = Backbone.Collection.extend({
model: LOAF.Business,
url: 'http://api.yelp.com/v2/search?',
fetch: function(options) {
var accessor, message, parameterMap, parameters;
if (!options) {
options = {};
}
accessor = {
consumerSecret: LOAF.auth.consumerSecret,
tokenSecret: LOAF.auth.accessTokenSecret
};
parameters = [];
parameters.push(['callback', 'cb']);
parameters.push(['oauth_consumer_key', LOAF.auth.consumerKey]);
parameters.push(['oauth_consumer_secret', LOAF.auth.consumerSecret]);
parameters.push(['oauth_token', LOAF.auth.accessToken]);
parameters.push(['oauth_signature_method', 'HMAC-SHA1']);
parameters.push(['location', "New York City"]);
message = {
'action': this.url,
'method': 'GET',
'parameters': parameters
};
OAuth.setTimestampAndNonce(message);
OAuth.SignatureMethod.sign(message, accessor);
parameterMap = OAuth.getParameterMap(message.parameters);
parameterMap.oauth_signature = OAuth.percentEncode(parameterMap.oauth_signature);
options.url = this.url;
options.data = parameterMap;
options.cache = true;
options.dataType = 'jsonp';
options.jsonpCallback = 'cb';
options.success = this._onResponse;
options.context = this;
return $.ajax(options);
},
_onResponse: function(data, textStats, xhr) {
debugger;
var _this = this;
return _.each(data.businesses, function(business) {
var busModel;
if (!_this.get(business.id)) {
busModel = new LOAF.Business(business);
return _this.add(busModel);
}
});
}
});
有两点需要注意: