【发布时间】:2019-08-24 19:29:32
【问题描述】:
我正在使用 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 没有“经过身份验证”,可以这么说。我使用浏览器复制了原始 curl 请求,它工作得很好,然后我用我的应用程序中的一个替换了 JSESSIONID,它停止工作,所以这是我使用 JSON-RPC 的问题吗?在使用之前我需要做任何形式的“身份验证”/验证吗?
编辑 2:我发现当我在 Chrome 中打开网站并将 JSESSIONID 替换为我的应用程序 sessionid 然后单击邮件页面时,我的应用程序中的请求有效,这再次使我相信存在某种加载页面时发生的身份验证。
【问题讨论】:
-
参数好吗? id、方法和参数周围是不是缺少
\"? -
@Larme 是的,参数很好,如果我在看到 sessionID 是什么后登录网站,我就能很快得到响应,这再次让我相信会话是'不处于“JSON-RPC”状态或其他状态