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

Sam*_*gNY 4 html javascript web-services ios 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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

Dav*_*ing 6

CloudKit.js库是CloudKit Web服务的包装器,其文档指出HTTP 421在调用需要身份验证的请求时发生,但用户未登录.

这是预期的,因为您的应用可能需要确定用户是否已登录,如果没有,则显示相应的登录按钮.关于身份验证CloudKit目录示例部分显示了如何通过调用来设置它container.setUpAuth(),这将检查用户并在未检测到任何人的情况下呈现登录按钮.这可能发生在你的init.js代码中,但没有看到它我不能确定.

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

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

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

您还需要确保已在Container的CloudKit仪表板中创建API令牌.这是初始化Container时使用的令牌.查看关于CloudKit JS和Web服务的WWDC 2015视频,以查看此演示.

我希望有所帮助!

更新:

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

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