2014-10-29 71 views
0

与POST请求的执行问题(angularjs($ HTTP))

我试图执行一个POST请求,但出现以下错误:

Error: Unexpected request: POST http://192.168.88.54:3000 
No more request expected 
at $httpBackend (file:///Users/vasyasemenov/workspace/tamua/ogogo-frontend/build/vendor/angular-mocks/angular-mocks.js:1176:9) 
at sendReq (file:///Users/vasyasemenov/workspace/tamua/ogogo-frontend/build/vendor/angular/angular.js:7721:9) 
at serverRequest (file:///Users/vasyasemenov/workspace/tamua/ogogo-frontend/build/vendor/angular/angular.js:7455:16) 
at wrappedCallback (file:///Users/vasyasemenov/workspace/tamua/ogogo-frontend/build/vendor/angular/angular.js:10696:81) 
at wrappedCallback (file:///Users/vasyasemenov/workspace/tamua/ogogo-frontend/build/vendor/angular/angular.js:10696:81) 
at file:///Users/vasyasemenov/workspace/tamua/ogogo-frontend/build/vendor/angular/angular.js:10782:26 
at Scope.$eval (file:///Users/vasyasemenov/workspace/tamua/ogogo-frontend/build/vendor/angular/angular.js:11697:28) 
at Scope.$digest (file:///Users/vasyasemenov/workspace/tamua/ogogo-frontend/build/vendor/angular/angular.js:11525:31) 
at Scope.$apply (file:///Users/vasyasemenov/workspace/tamua/ogogo-frontend/build/vendor/angular/angular.js:11803:24) 
at HTMLButtonElement.<anonymous> (file:///Users/vasyasemenov/workspace/tamua/ogogo-frontend/build/vendor/angular/angular.js:17690:21) 

我执行POST请求:

angular.module('App') 
.config(['$httpProvider', 
    function($httpProvider) { 
     $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; 
    } 
]) 
.service('API', function API($http, $q, PROD, PROD_HOST, DEV_HOST, API_TOKEN) { 
    var self = this; 

    self.host = (PROD ? PROD_HOST : DEV_HOST); 

    self.performRpcCall = { 
     post: function(url, params) { 
      var deferred = $q.defer(); 
      var data = { 
       jsonrpc: '2.0', 
       params: params, 
       method: url 
      }; 
      $http.post(self.host, data).success(function(data) { 
       if(data.result) { 
        deferred.resolve(data.result); 
       }else{ 
        deferred.reject(data.error); 
       } 
      }).error(function(data, status, headers, config) { 
       deferred.reject(data); 
      }); 
      return deferred.promise; 
     } 
    }; 

    self.registerUser = function(params) { 
     params.token = API_TOKEN; 
     return self.performRpcCall.post('/api/users', params); 
    }; 
}); 

哪里错误?谢谢

+0

你为什么在'$ http.post'调用时使用'$ q'? '$ http'已经返回一个promise,只是返回那个成功或者错误链接的数据。 – 2014-10-29 13:10:22

+0

你知道“延迟反模式”是什么吗?看看** [这](http://stackoverflow.com/questions/23803743/what-is-the-deferred-antipattern-and-how-do-i-avoid-it)** – Josep 2014-10-29 13:20:28

+0

你是单位测试这个?我在错误输出中看到'$ httpBackend',这是一个模拟对象来测试'$ http'请求,而不必实际联系服务器。 https://docs.angularjs.org/api/ngMock/service/$httpBackend – 2014-10-29 13:35:04

回答

0

不知道这是不是问题,但之前将对象作为数据参数传递给$http.post之前遇到了麻烦。

要更正我用jQuery的$.params(data)在过去或...

data = { 
    someVar : someVal, 
    anotherVar : anotherVal 
}; 
return $http({ 
     method : 'POST', 
     url : 'someURL/path/to/api/script', 
     params : data, 
     headers : {'Content-Type' : 'application/x-www-form-urlencoded'} 
    }).success(function(response){ 
     return (angular.isDefined(response.data.result)) ? response.data.result : response.data.error; 
    }).error(function(response){ 
     return { data : response.data, status : response.status }; 
    }); 

数据传递$http配置对象时得到JSONified为params变种。当然,您已经与供应商一起设置了标头。还有一个数据配置属性,我没有使用过,但我认为它也是一样的,但不是将数据JSON化成字符串,而是将它作为消息数据合并到头中。

+0

我见过的例子,但情况是类似的。 – MonstroDev 2014-10-29 13:53:53