Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to intercept $resource requests

Tags:

angularjs

Would there be a way to intercept requests in the $resource call?

I want to add an OAUTHv2 header to it, instead of specifying this for every resource model.

Currently I'm only able to intercept the response, as stated in the docs:

...

interceptor - {Object=} - The interceptor object has two optional methods - response and responseError. Both response and responseError interceptors get called with http response object. See $http interceptors.

I know you can push a global interceptor on $http, but I don't want to include my Bearer token in any request outside API calls (security...)

Anybody who is doing OAUTHv2 must have come across this problem. A pity there is no standard way in Angular.JS...

like image 384
Pepster Avatar asked Jun 06 '14 13:06

Pepster


People also ask

How do I intercept network requests?

To intercept HTTP requests, use the webRequest API. This API enables you to add listeners for various stages of making an HTTP request. In the listeners, you can: Get access to request headers and bodies and response headers.

How do I intercept an iframe request?

Your best option is to use a proxy on your server, and route the iframe request through there; re-writing all asset URL's through your proxy instead of direct access (but even then you have impossible edge cases to track, such as JavaScript including other assets etc etc.

Does fetch have interceptors?

The Fetch API doesn't support interceptors natively. However, there are other libraries for making HTTP calls that support interceptors.


1 Answers

Though, it's not obvious, there is a way to intercept $resource request.

Here is an example:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title>Intercept resource request</title>
  <style type="text/css">.ng-cloak { display: none; }</style>
  <script src="angular.js"></script>
  <script src="angular-resource.js"></script>
  <script>
    angular.module("app", ["ngResource"]).
      factory(
        "services",
        ["$resource", function ($resource)
        {
          return $resource(
            "http://md5.jsontest.com/",
            {},
            {
              MD5: 
              {
                method: "GET",
                params: { text: null },
                then: function(resolve)
                {
                  this.params.text = "***" + this.params.text + "***";
                  this.then = null;
                  resolve(this);
                }
              }
            });
        }]).
      controller(
        "Test",
        ["services", function (services)
        {
          this.value = "Sample text";

          this.call = function()
          {
            this.result = services.MD5({ text: this.value });
          }
        }]);
  </script>
</head>
<body ng-app="app" ng-controller="Test as test">
  <label>Text: <input type="text" ng-model="test.value" /></label>
  <input type="button" value="call" ng-click="test.call()"/>
  <div ng-bind="test.result.md5"></div>
</body>
</html> 

How it works:

  1. $resource merges action definition, request params and data to build a config parameter for an $http request.
  2. A config parameter passed into an $http request is treated as a promise like object, so it may contain then function to initialize config.
  3. Action's then function may transform request as it wishes.

The demo can be found at transform-request.html

Elsewhere I've already shown a similar approach used to cancel $resource request.

See also: Intercept angularjs resource request

like image 135
Vladimir Nesterovsky Avatar answered Oct 05 '22 08:10

Vladimir Nesterovsky