Gnome Shell 扩展:使用授权承载发送请求 Headers

Gnome Shell Extension: Send Request with Authorization Bearer Headers

我正在尝试构建一个需要与外部 REST API 通信的 gnome shell 扩展(使用 gjs)。为此,我需要在请求中附上 header: Authorization: Bearer <token>Content-Type: application/json.

我到处寻找这样的问题,确实找到了一些类似的问题,但其中 none 有效。该文档根本没有帮助,而且,如果有的话,它只会让我更加困惑。

使用 curl 我可以按如下方式发送该请求:

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

到目前为止,我只创建了发送没有 header 的简单 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);
}

知道如何添加 header 吗?任何帮助将不胜感激!

编辑:

通过使用@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 文件,其中包含用于执行 shell 命令的函数 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_headersSoup.MessageHeaders object to which you can append() 授权和内容类型 headers.

此外,对于内容类型 header,还有一个方便的 set_content_type() 方法。