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

时间:2015-06-16 21:17:15

标签: javascript html ios web-services cloudkit

我正在使用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 =&#34; apple-sign-in-button&#34;和span id =&#34;用户名&#34;摆脱了所有错误,除了:

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

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

2 个答案:

答案 0 :(得分:6)

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仪表板中为您的Container创建了一个API令牌。这是初始化Container时使用的令牌。查看关于CloudKit JS和Web服务的WWDC 2015视频,以查看此演示。

我希望有所帮助!

更新:

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

答案 1 :(得分:2)

将Dave Browning的评论复制到他的答案中作为一个全面的答案,因为这对我来说似乎是个问题:

  

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