2016-04-26 66 views
-1

我試圖在攔截器中準備http請求url,而不是將它添加到在$ http中傳遞的對象。下面是代碼,我嘗試了樣品:在AngularJS中的攔截器中準備http請求url

angular.module('myapp', []) 

.service('myservice', function() { 
    this.myfunction = function() { 
     var req = {method: 'POST', reqName: 'getInfo'}; 
     return $http(req); 
    } 
}) 

.factory('myInterceptor', function() { 
    var interceptor = { 
     'request': function(config) { 
      config.url = "http://www.myapi.com/demo/"+config.reqName; 
      return config; 
     } 
    } 
    return interceptor; 
}) 

.config(function($httpProvider) { 
    $httpProvider.interceptors.push('myInterceptor'); 
}) 

但我發現了一個錯誤,它說:

Error: [$http:badreq] Http request configuration url must be a string.

Received: undefined

任何幫助嗎?

+0

請仔細閱讀https://docs.angularjs.org/api/ng/service/$http#interceptors然後返回配置對象從'myInterceptor'工廠 –

+0

@KrzysztofSafjanowski您能否簡單解釋一下(如果您找到解決方案)。 –

+0

工廠**應該**返回變量'攔截器'。在'myInterceptor'中添加語句'return interceptor'將解決你的問題。 –

回答

0

讓我展示一些證明AngularJS文檔正確的測試。

一些細節有關攔截 - http://docs.angularjs.org/api/ng/service/$http#interceptors

angular.module('myApp', []) 
 
    .service('service', function($http) { 
 
    this.myfunction = function() { 
 
     var req = { 
 
     method: 'POST', 
 
     reqName: 'getInfo' 
 
     }; 
 
     return $http(req); 
 
    } 
 
    }) 
 
    .factory('myInterceptor', function() { 
 
    var interceptor = { 
 
     'request': function(config) { 
 
     config.url = "http://www.myapi.com/demo/" + config.reqName; 
 
     return config; 
 
     } 
 
    } 
 
    return interceptor; 
 
    }) 
 
    .config(function($httpProvider) { 
 
    $httpProvider.interceptors.push('myInterceptor'); 
 
    }) 
 

 

 
describe("myApp", function() { 
 
    beforeEach(module("myApp")); 
 

 
    it("executes intercpetor that changes request", inject(function(service, $httpBackend) { 
 
    $httpBackend.expectPOST("http://www.myapi.com/demo/getInfo").respond(201, []); 
 

 
    service.myfunction().then(function(r) { 
 
     expect(r.config.url).toBe('http://www.myapi.com/demo/getInfo') 
 
    }) 
 

 
    $httpBackend.flush(); 
 
    })); 
 
});
<link href="//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine.css" rel="stylesheet" /> 
 
<script src="//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine-2.0.3-concated.js"></script> 
 
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular-resource.min.js"></script> 
 
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular-mocks.js"></script>

+0

這沒有幫助! –

+0

請在文檔和我的答案以及您的代碼中找到任何區別 –

+0

對不起,但它對我無效。如果你能分享小提琴,我會很棒。 –