Как исправить ошибку JSON-RPC с кодом 591 с помощью swift - PullRequest
0 голосов
/ 05 апреля 2019

Я делаю приложение для iOS с Swift, которое я хочу использовать на сервере с 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, который собирает мое приложение, не является, так сказать, «аутентифицированным». Я скопировал исходный запрос скручивания из моего браузера, и он отлично работает, затем я заменил JSESSIONID на один из моего приложения, и он перестает работать, так это проблема с использованием JSON-RPC? Есть ли какая-либо форма «аутентификации» / проверки, которую мне нужно сделать перед ее использованием?

РЕДАКТИРОВАТЬ 2: я обнаружил, что, когда я открываю веб-сайт в Chrome и заменяю JSESSIONID на мои приложения sessionid, а затем нажимаю на страницу почты, запрос в моем приложении работает, что снова заставляет меня поверить, что есть какая-то аутентификации, которая происходит при загрузке страницы.

...