Расширение оболочки 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);
}

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

2 ответа

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

Используя ответ @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);

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

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

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

Другие вопросы по тегам