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_headers
是 Soup.MessageHeaders
object to which you can append()
授权和内容类型 headers.
此外,对于内容类型 header,还有一个方便的 set_content_type()
方法。
我正在尝试构建一个需要与外部 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_headers
是 Soup.MessageHeaders
object to which you can append()
授权和内容类型 headers.
此外,对于内容类型 header,还有一个方便的 set_content_type()
方法。