问题描述
我正在尝试构建一个需要与外部 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);
这根本没有效率,应该有更简单的方法。但是,在找到之前,我希望这能对其他人有所帮助。