Расширение оболочки Gnome: отправить запрос с заголовками носителя авторизации

Я пытаюсь создать расширение оболочки gnome (используя gjs), которое мне нужно для связи с внешним REST API. Для этого мне нужно сопровождать мои запросы заголовком: Authorization: Bearer <token> и Content-Type: application/json.

Я просмотрел все подобные вопросы и нашел несколько похожих, но ни один из них не работает. Документация совершенно бесполезна, и, скорее всего, она только еще больше запутала меня.

С помощью curl я мог бы отправить этот запрос следующим образом:

curl -X GET -H "Authorization: Bearer <token>" -H "Content-Type: application/json" <url>

До сих пор я создавал только расширения, которые отправляют простые запросы GET без заголовков. Тогда я бы сделал следующее:

const Soup = imports.gi.Soup;
let soupSyncSession = new Soup.SessionSync();

let message = Soup.Message.new('GET', url);
let responseCode = soupSyncSession.send_message(message);
let res;
if(responseCode == 200) {
    res = JSON.parse(message['response-body'].data);
}

Любая идея о том, как я могу добавить заголовки? Любая помощь будет оценена по достоинству!


person geoph9    schedule 21.01.2021    source источник


Ответы (2)


message.request_headers — это объект Soup.MessageHeaders, к которому можно append() заголовки авторизации и типа контента.

Кроме того, существует удобный метод set_content_type() для конкретно заголовок типа контента.

person ptomato    schedule 23.01.2021
comment
Спасибо, это работает! - person geoph9; 23.01.2021

РЕДАКТИРОВАТЬ:

Используя ответ @ptomato, я использовал следующий код:

function send_request(url, type='GET') {
    let message = Soup.Message.new(type, url);
    message.request_headers.append(
        'Authorization',
        `Bearer ${token}`
    )
    message.request_headers.set_content_type("application/json", null);
    let responseCode = soupSyncSession.send_message(message);
    let out;
    if(responseCode == 200) {
        try {
            out = JSON.parse(message['response-body'].data);
        } catch(error) {
            log(error);
        }
    }
    return out;
}

Первоначальный комментарий:

Итак, мне удалось найти обходной путь, но он неэффективен, поэтому я не буду отмечать его как принятый ответ. Если кто-нибудь знает, как ответить на мой вопрос, используя Soup, пожалуйста, ответьте!

Мой обходной путь включает использование файла imports.misc.util, который включает функцию spawnCommandLine для выполнения команд оболочки. Итак, я использовал curl для загрузки json в файл (переменная path ниже):

Util.spawnCommandLine(`/usr/bin/curl -X ${type} -H "Authorization: Bearer ${token}" -H "Content-Type: application/json" ${url} -o ${path}`);

а затем я прочитал содержимое, используя следующее:

let text = GLib.file_get_contents(path)[1];
let json_result = JSON.parse(text);

Это совсем неэффективно, и должен быть более простой способ. Но, пока это не найдено, я надеюсь, что это сможет помочь кому-то еще.

person geoph9    schedule 22.01.2021