4

ユーザーのプロファイルを更新するためにサービス層のエンドポイントに POST する場合、要求ペイロード (クライアントからの必要な変更を含むプロファイル) から特定の値を削除し、それらを応答ペイロード (からの更新されたプロファイル) に再アタッチする必要があります。サーバー)。私は現在、次のように、 Angular のrequest および response トランスフォーマーを使用して動作を実行しています。

myService.updateProfile = function (profile) {

    return $http({
        method: 'POST',
        withCredentials: true,
        url: root + 'users/profile',
        data: profile,
        transformRequest : requestTransformer,
        transformResponse : responseTransformer
    });

};

// the map used during transformation below
var myMap = {
    0: 'foo', 
    1: 'bar',
    2: 'etc'
};

// prependTransform() and appendTransform() are similar to the example provided in Angular transformer docs here:
// https://docs.angularjs.org/api/ng/service/$http#overriding-the-default-transformations-per-request
var requestTransformer = httpTransformer.prependTransform($http.defaults.transformRequest, function(profileRequest) {
    profileRequest.myKey = myMap.indexOf(profileRequest.myValue);
    delete profileRequest.myValue;

    return profileRequest;
});
var responseTransformer = httpTransformer.appendTransform($http.defaults.transformResponse, function(profileResponse) {
    profileRequest.myValue = myMap[profileRequest.myKey];
    delete profileRequest.myKey;

    return profileResponse;
});

デフォルトのリクエスト トランスフォーマーにトランスフォーマーを追加し、デフォルトのレスポンス トランスフォーマーにトランスフォーマーを追加します。私の質問は、これを行うためのより良い方法はありますか? ここに記載されているように、代わりにインターセプターを使用している可能性がありますか? もしそうなら、どのように?

4

1 に答える 1

0

あなたのソリューションは問題ないと思いますが、別の方法が必要な場合は、そのように特定のリクエストをインターセプトできます。HTTP インターセプターは、グローバルな HTTP 要求/応答 (認証、エラー処理など) を処理するのに最も役立ちます。

いずれにせよ、「応答」ペイロードは API/サーバー側から処理する必要があります。

$provide.factory('userProfileInterceptor', function() {
  return {
    request: function(config) {
       if (config.url.indexOf('/users/profile') >=0){
           if (config.params.myValue) delete config.params.myValue;
       }
       return config;
    },
    response: function(response) {
       if (response.config.url.indexOf('/users/profile') >=0){
           delete response.data.myKey;
       }
       return response;
    }
  };
});

$httpProvider.interceptors.push('userProfileInterceptor');
于 2015-06-16T19:52:34.293 に答える