4

При отправке POST на конечную точку на сервисном уровне для обновления профиля пользователя мне нужно снять определенные значения из полезной нагрузки запроса (профиль с требуемыми изменениями от клиента) и повторно подключить их в полезной нагрузке ответа (обновленный профиль с сервера). Я в настоящее время выполняет поведение с помощью Угловое-х request and response transformers, как это:Правильное использование трансформаторов против перехватчиков

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

I предварять трансформатор для трансформаторов запроса по умолчанию и добавить трансформатор для трансформаторов отклика по умолчанию. Мой вопрос: есть ли лучший способ сделать это? Возможно, вместо этого используется interceptors, as documented here,? Если да, то как?

+0

Я бы просто обернул http-запрос в службе. В принципе, перед вызовом вы снимаете его, затем он возвращается, вы можете добавить его обратно в .then call. – Strawberry

+0

Вы можете использовать перехватчики, но они в основном полезны для перехвата HTTP-запросов/ответов во всем мире (что означает для каждого сделанного вызова). Вы все еще можете использовать перехватчики, но вам нужно определить конкретный маршрут API, который будет обрабатываться вашим перехватчиком. –

ответ

0

Я думаю, что ваше решение в порядке, но если вы хотите альтернативу, вы можете перехватить конкретные запросы так. HTTP-перехватчики в основном полезны для обработки глобальных HTTP-запросов/ответов (auth, обработка ошибок и т. Д.).

В любом случае полезную нагрузку «ответ» следует учесть со стороны 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'); 

 Смежные вопросы

  • Нет связанных вопросов^_^