【问题标题】:Gnome Shell Extension: Send Request with Authorization Bearer HeadersGnome Shell 扩展:发送带有授权承载标头的请求
【发布时间】:2021-01-21 15:22:20
【问题描述】:

我正在尝试构建一个我需要与外部 REST API 通信的 gnome shell 扩展(使用 gjs)。为此,我需要在我的请求中附上标题: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);
}

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

【问题讨论】:

    标签: authentication gnome-shell-extensions gjs libsoup


    【解决方案1】:

    编辑:

    通过使用@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 用于执行 shell 命令。因此,我使用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);
    

    这根本没有效率,应该有更简单的方法。但是,在找到之前,我希望这能够帮助其他人。

    【讨论】:

      【解决方案2】:

      message.request_headers 是一个Soup.MessageHeaders 对象,您可以向其append() 授权和内容类型标头。

      另外还有一个方便的set_content_type() 方法专门用于内容类型标头。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-01
        • 2016-06-27
        • 1970-01-01
        • 1970-01-01
        • 2020-01-06
        • 2019-05-29
        • 1970-01-01
        相关资源
        最近更新 更多