如何使用 swift 修复 JSON-RPC 错误代码 591

How to fix JSON-RPC error code 591 with swift

我正在制作一个带有 Swift 的 iOS 应用程序,我想将其与具有 JSON-RPC 的服务器(服务器不属于我)一起使用。我已经能够登录到服务器并保存我知道正在工作的 cookie,因为能够查看服务器其他部分的内容,这些内容只有在经过身份验证时才可见,但是当我尝试使用 JSON -RPC 它抛出一个错误

{\"id\":3,\"error\":{\"code\":591,\"msg\":\"method with the requested number of arguments not found (session may have timed out)\"}}

JSON-RPC 用于登录并列出所有方法,所以我认为必须登录的方法有问题

我试图通过在 params 字段中加上引号来解决这个问题,但这也没有用。当我登录时,我必须提交请求正文,我必须使用字符串而不是字典。

我用来发送请求的代码是这样的:

    guard let url = URL(string: "JSON-RPC URL") else { return; };
    let params: Data? = "{id:3,method:\"mailDelegate.getMailData\",params:[]}".data(using: .utf8);
    var request = URLRequest(url: url);
    request.httpMethod = "POST";
    request.httpBody = params;
    request.addValue(cookies, forHTTPHeaderField: "Cookie");
    let session = URLSession.shared;
    print("Sending request with cookies of " + cookies);
    session.dataTask(with: request) { (data, response, err) in
        print(String(data: data, encoding: .utf8));
    }.resume();

当我执行此操作时,我希望它显示电子邮件数据(如果我使用 chrome 开发人员工具并将请求复制为 curl 并将其粘贴到终端中,则可以看到),但它却获取了我在问题的第一部分中显示的错误。

编辑 1:我发现我的应用程序收集的 JSESSIONID 可以说不是 "authenticated"。我使用我的浏览器复制了原始的 curl 请求,它工作得很好,然后我用我的应用程序中的一个替换了 JSESSIONID,它停止工作,所以这是我使用 JSON-RPC 的方式的问题吗?在使用它之前,我需要做任何形式的 "authentication"/验证吗?

编辑 2:我发现当我在 Chrome 中打开网站并将 JSESSIONID 替换为我的应用程序 sessionid 然后单击邮件页面时,我的应用程序中的请求有效,这再次导致我相信当我加载页面时会发生某种身份验证。

好的,所以我知道这已经晚了,但是对于任何想知道我是如何修复它的人,或者如果你们中的任何人有同样的错误,我能够通过向邮件页面发送 GET 请求来解决这个问题在尝试使用 mailDelegate 之前访问网站,因为我猜网站在该会话下加载页面之前不会初始化委托。