2

実際の Web サーバーが表示されず、AJAX 経由で Yelp API と対話するローカル プロジェクトにバックボーンを使用しようとしています。Yelp API では、認証に oauth を使用する必要があり、独自のコードをモデル化したサンプル コードが提供されます。サンプルコードを使用すると、Cross-Origin などで問題が発生することはありません。ただし、ブラウザーのセキュリティ オプションをオフにすると、エラーに対して 400 応答が返されます。

次のようにフェッチメソッドを上書きしようとしました:

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 を処理して自分で応答を解析する代わりに、このコレクションの「同期」メソッドを上書きすることだと思います。これを行うより良い方法はありますか?

4

1 に答える 1

1

これが適切な方法かどうかはわかりませんが、このように機能するので、ここに私の解決策があります。fetch をオーバーライドし、デフォルトの fetch メソッドを呼び出すことはありません。代わりに、fetch メソッドで ajax 呼び出しを行いonResponse、応答を処理するメソッドを用意して、応答のモデル (Yelp ビジネス) を作成します。これが同じ立場の人に役立つことを願っています。

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);
      }
    });
  }
});

2 つの注意事項:

  1. 最初のコードは機能していましたが、consumerSecret のスペルが間違っていたため、不適切な OAuth 呼び出しが発生していました。そのため、400 エラーが発生していました。
  2. これを修正しても、Cross-Origin 呼び出しの問題があります。私が使用した AJAX メソッドに切り替えると、この問題が軽減されます。ただし、これを Backbone によりネイティブに修正する方法が存在する可能性があります。私のプロジェクトの時間枠では、これではうまくいきません。
于 2012-12-03T09:16:58.567 に答える