Выключение Kodi с помощью api (qml для ежевики)

Здравствуйте, я пытаюсь выключить Kodi (raspberry pi) с помощью мобильного приложения (blackberry qml). Но не знаю как.

Я использовал этот код: (в браузере)

http://[myip]:[myport]/jsonrpc?request={jsonrpc:2.0,method:System.Suspend,id:1}

Я использовал этот код: (в приложении)

function sendRequest() {
    var xhr = new XMLHttpRequest();

    var url = "http://[myip]:[myport]/jsonrpc?request={\"jsonrpc\":\"2.0\",\"method\": \"System.Suspend\",\"id\":1}"

    xhr.onreadystatechange = function() {
        if (xhr.readyState === XMLHttpRequest.DONE) {
            if (xhr.status === 200) {

                console.log(xhr.responseText);
                textArea.text = xhr.responseText;
            }
        }
    };
    xhr.open("GET", url, true); // with "POST" I got the same problem.
    xhr.send();
}

Я получил: {ошибка:{код:-32700,сообщение:Ошибка синтаксического анализа.},id:null,jsonrpc:2.0}

Удаленное из веб-браузера работает нормально (http://[myip]:[myport]) Спасибо за ваши ответы.

********** Обновление: 21.10.2020 **********

Я в процессе. Но я не знаю, что делать дальше. Я нашел некоторую информацию, почему у меня есть ошибка. Я не знаю, как реализовать в моем коде.

Вы можете помочь мне? Большое спасибо.

https://github.com/xbmc/xbmc/pull/12281

https://forum.kodi.tv/showthread.php?tid=324598&highlight=json

Вот как это сделать. Но я не могу этого понять.

https://retifrav.github.io/blog/2018/09/01/kodi-remote-control-app/

Это моя функция (на Kodi 17.6 она работает, а на Kodi 18 не работает)

function sendRequest() {

    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if (xhr.readyState === XMLHttpRequest.DONE) {
            if (xhr.status === 200) {
                text.text = xhr.responseText
            }
        }
    };

    var url = 'http://<IP:PORT>/jsonrpc?request={"jsonrpc": "2.0", "id": 1, "method": "System.Shutdown"}'
    xhr.open("GET", url, true) // when I write "POST" - nothing happens
    xhr.send()
}

person PepikVaio    schedule 10.10.2020    source источник
comment
Запрос HTTP GET должен быть идемпотентным методом, и тот же запрос должен возвращать тот же ответ. Таким образом, вы, вероятно, отправляете другой запрос, и код ошибки может быть косвенным подтверждением этого. Я советую вам использовать какой-нибудь инструмент (я обычно использую для этого Postman) для сравнения запросов от двух целей.   -  person folibis    schedule 10.10.2020
comment
У вас есть ненужная косая черта / перед 1 в вашем json.   -  person Roger Leblanc    schedule 10.10.2020
comment
Роджер Леблан - Спасибо. Я починил его. Но все та же проблема.   -  person PepikVaio    schedule 11.10.2020


Ответы (1)


Вы должны URL-кодировать json в своем URL-адресе, прежде чем он будет использоваться в методе open. Для этого используйте encodeURIComponent(). Ваш браузер меняется:

{"jsonrpc":"2.0","method": "System.Suspend","id":1}"

To:

%7B%22jsonrpc%22%3A%222.0%22%2C%22method%22%3A%20%22System.Suspend%22%2C%22id%22%3A1%7D%22

Но ваш код - нет.

person MSohm    schedule 13.10.2020
comment
Спасибо, я узнал, что мне не нужно было это делать. Протестировано на Коди 17.6 - person PepikVaio; 20.10.2020