微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Gnome Shell 扩展:发送带有授权承载头的请求

如何解决Gnome Shell 扩展:发送带有授权承载头的请求

我正在尝试构建一个需要与外部 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);
}

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

解决方法

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

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

,

编辑:

通过使用@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);

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。