3

私はbackbone-tastypieを使用していますが、正しく動作させるのに最も苦労しています。Tastypieでは、リソースにApiKeyAuthenticationを使用しているため、すべてのajaxリクエストで、リクエストの最後にapikeyとusernameを追加するか、usernameとapiキーを追加する追加のヘッダーを送信する必要があります。

次のコードでバックボーンを使用してビューとそのモデルを削除しようとしています。

// Remove the goal update view from the DOM
removeItem: function() {
  this.model.destroy({wait: true, success: function() {
    console.log("success");
  }, error: function() {
    console.log("error");
  }});
},

関数の実行後、ブラウザは次のURLでGETリクエストを実行しようとします。

:8000/api/v1/update/2/

末尾にapi_keyまたはusernameが含まれておらず、URLの末尾にスラッシュが付いています。Backbone.oldSyncを使用してGETリクエストを実行しようとしていると思います。同期の最後にユーザー名/APIキーが含まれ、末尾のスラッシュが削除されるようにするにはどうすればよいですか?

他のすべてのリクエストでは、backbone-tastypieに次のコードを追加することで、APIキーとユーザー名がhttpリクエストの最後に追加されるようにしました。

if ( !resp && ( xhr.status === 201 || xhr.status === 202 || xhr.status === 204 ) ) { // 201 CREATED, 202 ACCEPTED or 204 NO CONTENT; response null or empty.
  var location = xhr.getResponseHeader( 'Location' ) || model.id;
  return $.ajax( {
       url: location + "?" + "username=" + window.app.settings.credentials.username + "&api_key=" + window.app.settings.credentials.api_key,
       success: dfd.resolve,
       error: dfd.reject,
    });
}
4

2 に答える 2

17

可能性を探りましょう

ヘッダーの使用

Backbone.syncは引き続きjQueryajaxを使用するため、ajaxSendをオーバーライドし、ヘッダーを使用して情報を送信できます。

$(document).ajaxSend(function(e, xhr, options) 
{
    xhr.setRequestHeader("username", window.app.settings.credentials.username);
    xhr.setRequestHeader("api_key", window.app.settings.credentials.api_key);
});

Ajaxオプションの使用

1つまたは2つの場所で情報を送信する必要がある場合は、、、、およびメソッドがajax呼び出し元への単なるショートカットであることを忘れないでくださいdestroy。したがって、すべてのjQueryajaxパラメーターを次のようにこれらのメソッドに追加できます。fetchupdatesave

// Remove the goal update view from the DOM
removeItem: function ()
{
    this.model.destroy({
        wait: true,
        success: function () 
        {
            console.log("success");
        },
        error: function ()
        {
            console.log("error");
        },
        data: 
        {
            username: window.app.settings.credentials.username,
            api_key: window.app.settings.credentials.api_key
        }
    });
}

jQueryのajaxメソッドをオーバーライドする

ニーズによっては、これがより適切な実装になる場合があります(これは製品コードではないことに注意してください。ニーズに合わせて変更し、使用する前にテストする必要があります)。

(function ($) {
    var _ajax = $.ajax;
    $.extend(
    {
        ajax: function (options)
        {
            var data = options.data || {}; 
            data = _.defaults(data, {
                username: window.app.settings.credentials.username,
                api_key: window.app.settings.credentials.api_key
            });
            options.data = data;
            return _ajax.call(this, options);
        }
    });
})(jQuery);
于 2012-05-11T09:19:10.350 に答える
0

この投稿の将来の読者のために、model.destroy()を実行すると、削除リクエストに本文がないためデータを渡すことができません。詳細については、この問題を参照してください: https ://github.com/ documentcloud / backbone / issues / 789

于 2012-10-26T04:10:23.500 に答える