加载资源失败:服务器响应状态为 421(错误请求)

Posted

技术标签:

【中文标题】加载资源失败:服务器响应状态为 421(错误请求)【英文标题】:Failed to load resource: the server responded with a status of 421 (Bad Request) 【发布时间】:2015-06-16 21:17:14 【问题描述】:

我正在使用 Apple 的新 CloudKit JS 参考和示例代码来构建一个简单的 CRUD 应用程序。在我什至可以到达 CRUD 之前,我被 Apple 身份验证阻止了。

index.html
<html>
<body>

<div id="apple-sign-in-button">Sign in
       <span id="username"></span>
</div>

<script>
    /*
     * Initialize the global objects we will need.
     */
    if(typeof CKCatalog === 'undefined') 
        CKCatalog = ;
    

    if(typeof CKCatalog.tabs === 'undefined') 
        CKCatalog.tabs = 
            'readme': [],
            'not-found': []
        ;
    
</script>

<script src="js/init.js"></script>
<script src="js/cloudkit-code-samples/authentication.js"></script>
<script>
    window.addEventListener('cloudkitloaded',CKCatalog.init);
</script>
<script async src="https://cdn.apple-cloudkit.com/ck/1/cloudkit.js">    </script>

</body>

包括 div id="apple-sign-in-button" 和 span id="username" 摆脱了所有错误,除了:

在其他任何地方提及此错误通常都与 SMTP 或 FTP 相关。知道发生了什么吗?

【问题讨论】:

我得到了完全相同的错误。我什至尝试提供 ssl 证书,但没有运气。 【参考方案1】:

CloudKit.js 库是 CloudKit Web 服务的包装器,its documentation 指出当调用需要身份验证但用户未登录的请求时会发生 HTTP 421。

这是意料之中的,因为您的应用可能需要确定用户是否已登录,如果未登录,则显示相应的登录按钮。 CloudKit Catalog example's section on Authentication 显示了如何通过调用 container.setUpAuth() 进行设置,这将检查用户并在未检测到用户时呈现登录按钮。这可能发生在您的 init.js 代码中,但没有看到它我无法确定。

我看到您的页面上有 apple-sign-in-button div。如果您正在调用 setUpAuth 方法,那么您应该会看到其中呈现的登录按钮。

一旦用户单击该按钮并登录,您就可以重新发出收到 421 的原始请求,并且应该会得到有效的 200。

不要忘记,如果您想保留用户的 CloudKit 会话,您可以在初始化 Container 时使用 auth: persist: true (有关更多信息,请参阅 CloudKit.js 文档)。

您还需要确保已在 CloudKit 仪表板中为您的容器创建了一个 API 令牌。这是您在初始化 Container 时使用的令牌。观看有关 CloudKit JS 和 Web 服务的 WWDC 2015 视频以查看此演示。

希望对你有帮助!

更新:

测试您的 Web 应用程序时,请确保您已配置 API 令牌(使用 CloudKit 仪表板)以允许您正在测试的域(例如 localhost)。这最初是 Sam 的问题,但 localhost 现在是开发环境中 API 令牌支持的域。

【讨论】:

嗨,大卫,谢谢您的回复。我忽略的错误代码文档和您的观点一样很有帮助。仅供参考,我确实在 init.js 中设置了一个令牌 + 我的容器名称,并且坚持:真。我看到调用了 setupAuth (在 authentication.js 中),但是从未生成按钮,调用 setupAuth 后发生的是调用函数 goToUnauthenticatedState 。为了让按钮呈现,我必须在 index.html 中构造另一个 吗?从文档看来并非如此,但也许我必须做一些与 DOM 相关的事情。我对JS不是很熟悉 嗨,山姆。事实证明,如果您的 apple-sign-in-button div 中有任何内容,它不会呈现该按钮(因为它担心可能已经呈现了一个)。这是一个错误,我会确保我们继续修复它,但与此同时,如果您将 div 完全留空(甚至没有空格或返回字符),那么您应该会看到该按钮出现。 Sooo...按钮现在呈现,点击后会弹出 Apple iCloud 登录窗口,但我仍然遇到同样的错误,当我尝试在弹出窗口中登录时窗口我在控制台中又得到了两个相同的错误。我在此处添加了这些错误的 console.log:hastebin.com/udopeputah.avrasm -- 感谢您的帮助! 我很清楚,您成功登录,弹出窗口关闭,您的应用仍然认为您未经身份验证? 啊哈!本地主机是问题所在。 localhost 目前不支持作为 CloudKit Web 服务的有效域,但它也是一个已知错误。如果您使用工具将本地服务器映射到虚假域(例如 foo.com),那么它现在应该可以解决您的问题。【参考方案2】:

复制 Dave Browning 对他的回答的评论作为一个完整的答案,因为这似乎是我的问题:

本地主机是问题所在。目前不支持 localhost 作为 CloudKit Web 服务的有效域,但它也是一个已知的错误。如果 您使用工具将本地服务器映射到假域(例如 foo.com) 那么它现在应该可以解决您的问题

【讨论】:

以上是关于加载资源失败:服务器响应状态为 421(错误请求)的主要内容,如果未能解决你的问题,请参考以下文章

错误:加载资源失败:服务器响应状态为 404(未找到)

收到错误消息;加载资源失败:服务器响应状态为 500

加载资源失败:服务器响应状态为 439(应用程序不活动)

加载资源失败:服务器响应状态为 500(内部服务器错误)当我尝试上传图像时发生此错误

错误:无法匹配任何路由。 URL 段:“配置文件”或加载资源失败:服务器响应状态为 401(未授权)

加载资源失败:服务器响应状态为 404(未找到)