2013-05-20 69 views
0

我有一个使用$ http服务从远程服务器获取数据的角度应用程序。在某些情况下,我需要为每个请求附加一个自定义标题值,并且我想使用facilities provided by the framework来完成此操作。

出于安全原因,要在角应用的Web服务器上计算要添加的标头值,这意味着requestTransform必须首先向应用Web服务器发出请求以获取标头值并将其添加到$ http请求中从远程服务器获取数据。

是否可以使用requestTransform来完成此任务?或者,将需要和包装我的数据获取调用服务,从$ http调用到远程服务器之前,从应用程序Web服务器获取标头值。

回答

2

不,变换请求/响应函数是同步的,所以不能用于你的特定情况。幸运的是,拦截器最近被添加到AngularJS的1.1.x分支中。这些拦截器是基于承诺的,因此您可以在实际调用之前使用它们执行异步处理。

http://code.angularjs.org/1.1.4/docs/api/ng.$http

+0

我想我的问题不清楚。我希望转换函数会同步发生,听起来就像它一样。所以,为了确认,我可以在转换函数中创建一个异步请求,直到'内部'请求返回才会发出'外部'函数。 – Jason

+0

@Jason我真的不认为你可以在转换函数中做异步请求......但是请给它一个... –

+0

哦,我误解了你的评论。我看到你现在说的话,转换函数必须同步完成,所以它的结果可用于$ http服务调用。得到它了。 – Jason

1

的“拦截器”一节中更多信息如果您正在全球范围内设置你的Ajax转换功能(通过$httpProvider.defaults.transformRequest)和你的变身功能也使用HTTP $做预检要求,可能比你会陷入无限循环,因为每个预检请求都会以递归方式调用另一个预检请求。

所以,唯一的选择是只对你特定的$ http服务设置请求转换函数。

现在,因为trnf。函数是同步执行的(请参阅https://github.com/angular/angular.js/blob/master/src/ng/http.js#L671),您可能希望确保您的预检请求也是同步执行的,但由于您无法使用$ http来执行此操作,因此您唯一的选择是使用另一种形式的预检ajax请求jQuery.ajax()或本机与纯JS)。

+0

好点,我没有考虑到无限循环的潜力,我将不得不考虑这一点 – Jason