Http 全球响应401英寸聚合物

Http 全球响应401英寸聚合物,http,login,polymer,polymer-1.0,http-status-code-401,Http,Login,Polymer,Polymer 1.0,Http Status Code 401,使用Polymer 1.0,我正在寻找当应用程序从应用程序服务收到401时向用户显示登录的最佳方法 使用Angular,我会考虑使用httpInterceptor来实现这一点,在聚合物中是否有等效物 这里有一种方法(使用iron ajax)显式地路由来自服务元素的错误 这是可行的,但由于登录是我希望实现的,而不必专门连接元素来解决这个问题,因此我创建了一个用于所有Ajax请求的组件。在该组件中,侦听了401个服务调用,并在找到时调用this.fire('401-found') 然后在我的其他组件

使用Polymer 1.0,我正在寻找当应用程序从应用程序服务收到401时向用户显示登录的最佳方法

使用Angular,我会考虑使用httpInterceptor来实现这一点,在聚合物中是否有等效物

这里有一种方法(使用iron ajax)显式地路由来自服务元素的错误


这是可行的,但由于登录是我希望实现的,而不必专门连接元素来解决这个问题,因此我创建了一个用于所有Ajax请求的组件。在该组件中,侦听了401个服务调用,并在找到时调用this.fire('401-found')

然后在我的其他组件中,我听到了这样一个事件——在我的例子中,在主文档中,弹出一个对话框,要求用户再次登录


一个稍微好一点的方法是让Ajax组件接受参数,即“是触发401事件”和“不给它标准401事件”,将其命名为“this”,然后在每个组件中,您可以侦听此类事件并做出相应的反应。

答案是在事件在dom中冒泡时捕捉最外层元素上的错误

<div on-error="onError">
    <values-service values="{{items}}"></values-service>
    <other-service></other-service>
    ...

</div>
当任何包含的服务或包含服务的任何包含元素触发错误时,处理程序将触发-我对请求和401进行相关检查,并显示我的登录对话框

我最近向(几天前合并的)添加了一个可选的
bubbles
属性以完成此操作。当
气泡
属性存在时,iron ajax的
请求
响应
,以及
错误
事件气泡会出现在
窗口
。这意味着您可以在
窗口
上设置全局事件监听器,并根据需要处理
401
s,而无需在iron ajax调用中添加
气泡

更重要的是,由于它是iron ajax的一部分,它得到了Polymer团队的正式支持


这是。

谢谢你的回复,这是个好主意。问题是我可能正在使用我没有编写的ajax组件:/为什么不将这些ajax组件嵌入到您自己的组件中呢?我嵌入了polymer ajax组件,然后查看了401个响应的响应对象。您使用什么组件进行服务调用?这就是我的示例中的values service,但这里的要点是全局401处理将values services包装到一个新组件中,它将值和错误值传递给新组件的用户,并在OneError回调中,查找上述401和fire事件?唯一的缺点是每次回调都必须进行401检查;当你有足够的代码时,就会有很多重复的、可能很脆弱的代码。如果将value service元素包装在新元素中,则可以使用相同的系统,新元素将查找401并显式触发名为401的事件。401由我的API控制。这种方法意味着没有重复,根目录下只有一个401处理程序。所以不像你描述的那样
(function (document) {
    'use strict';

    var app = document.querySelector('#app');

    app.onError = function (e) {

        console.log('app.onError ' + e.detail.request.status);
    };

    app.addEventListener('error', app.onError);

})(document);
<div on-error="onError">
    <values-service values="{{items}}"></values-service>
    <other-service></other-service>
    ...

</div>
app.onError = function (e) {

    console.log('app.onError ' + e.detail.request.status);
};