【问题标题】:How can we check if response for the request came from Service Worker我们如何检查请求的响应是否来自 Service Worker
【发布时间】:2015-07-14 19:08:35
【问题描述】:

在 HTTP Request 状态代码旁边的 Google Chrome 控制台中,我们有信息 (from ServiceWorker)

Request 可以知道 Response 来自 ServiceWorker 吗?比较 dateResponse Headers 可能吗?

【问题讨论】:

    标签: javascript offline service-worker fetch-api


    【解决方案1】:

    按照设计,通过FetchEvent#respondWith() 返回的响应与没有服务工作者参与的响应无法区分。无论我们所说的响应是通过XMLHttpRequestwindow.fetch(),还是在某些元素上设置src= 属性,这都适用。

    如果区分哪些响应源自 Service Worker 的参与对您很重要,那么我能想到的最简洁的方法是将 HTTP 标头显式添加到输入到 FetchEvent#respondWith()Response 对象中。然后,您可以从受控页面检查该标题。

    但是,根据您的服务人员如何获取其Response,这可能有点棘手/hacky,除非您有强大的用例,否则我不能说我推荐它。以下是(同样,不推荐)方法的样子:

    event.respondWith(
      return fetch(event.request).then(function(response) {
        if (response.type === 'opaque') {
          return response;
        }
    
        var headersCopy = new Headers(response.headers);
        headersCopy.set('X-Service-Worker', 'true');
    
        return response.arrayBuffer().then(function(buffer) {
          return new Response(buffer, {
            status: response.status,
            statusText: response.statusText,
            headers: headersCopy
          });
        });
      })
    )
    

    如果您返回一个不透明的Response,除了将它直接返回到页面之外,您将无能为力。否则,它会将一堆东西复制到一个新的Response 中,该X-Service-Worker 标头设置为true。 (这是一种迂回的解决方法,即您不能直接修改由fetch() 返回的Responseheaders。)

    【讨论】:

    • 谢谢,杰夫。该问题是您的previous answer 的结果,您在其中指出确保您的用户知道他们的HTTP POST 正在排队。让用户(应用程序)意识到这一点的最佳实践是什么?我认为附加标头将是一个不错的选择,因为 ServiceWorkers 是代理并且正在处理整个 fetch/cache/respond 操作。因此,应用程序本身没有其他选项可以知道离线。
    • 我想说你应该重播来自受控页面的请求,而不是服务工作者,以便请求许可/通知用户。如果您在 IDB 中对它们进行排队,那么您可以通过受控页面轻松加载它们。如果您使用缓存存储 API 对它们进行排队,则可以在 Chrome 43+ 中使用 window.caches 加载它们。由于您的受控页面知道这是一个重播请求,因此您不需要服务工作者添加特殊的标头或类似的东西。
    • 你不觉得它是反模式吗?在现代软件开发中,我们希望为代码的特定部分设置层,并将 SW 视为programmable network proxy,我们的应用程序应该只关心发送请求,并且 SW 应该执行使其工作所需的所有操作。它有一些独特的方法来做到这一点,比如后台同步。我认为我们应该在 Alex 的 GitHub 上继续讨论。
    • 在只有软件参与的情况下“在后台”重播对于分析 ping 之类的事情是有意义的。但是我们只是在events.google.com/io2015 中添加了离线我的日程更改的回放,我可以根据经验说我们别无选择,只能从受控页面启动它。只有受控页面可以访问新的 OAuth 2 令牌。从受控页面启动重播还可以更轻松地在用户完成时通知用户,而无需添加“hacky”标头。
    • 非常有帮助的答案(像往常一样)@JeffPosnick。一个问题:当您创建新的Response 时,您从response 复制statusstatusText 属性。您是否还应该复制其他属性,例如 oktypeurl? (即此处所述:developer.mozilla.org/en-US/docs/Web/API/Response#Properties
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2017-03-27
    • 2016-06-23
    • 2023-02-14
    • 2021-03-12
    相关资源
    最近更新 更多