Расширение оболочки 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()
конкретно для заголовка типа контента.