我正在用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,然后单击邮件页面时,我的应用程序中的请求有效,这再次使我认为存在某种形式加载页面时发生的身份验证。
答案 0 :(得分:1)
好,所以我知道这很晚了,但是对于任何想知道我如何解决它或者如果您有任何错误的人,我能够通过将GET请求发送到网站的邮件页面来解决此问题,尝试使用mailDelegate,因为我猜网站要在该会话下加载页面后才初始化委托。