2016-04-26 115 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

对不起,但它对我无效。如果你能分享小提琴,我会很棒。 –