使用 Soup 使用具有基本身份验证的 Web 服务
Consume a webservice with basic authentication using Soup
作为 gnome-shell 扩展的一部分,我尝试使用 xmlrpc 使用 Web 服务。 Web 服务需要基本身份验证 header。使用 Soup,我得到了以下代码(基本上是 openweather 扩展的蓝图):
function load_json_async() {
if (_httpSession === undefined) {
_httpSession = new Soup.Session();
} else {
// abort previous requests.
_httpSession.abort();
}
let message = Soup.xmlrpc_message_new (
"https://api.sipgate.net/RPC2",
"samurai.BalanceGet",
new GLib.Variant('()',1.0)
)
_httpSession.connect('authenticate',
Lang.bind(
this,function(session,message, auth,retryFlag){
auth.authenticate("xxxxx","xxxxx");
}
)
)
_httpSession.queue_message(
message,
Lang.bind(this,
function(_httpSession, message) {
try {
if (!message.response_body.data) {
log("hello1 "+message.response_body.status)
return;
} else {
log("got message-status:"+message.status_code)
}
log(message.response_body.data)
} catch (e) {
log("exception:"+e)
return;
}
return;
}));
return;
}
我正在使用 Soup 建立连接。在执行 queue-callback 之前执行身份验证信号。
仍然,在回调的开始,response_body 持有状态代码 401 而不是预期的授权。 incorrect.After 更正此问题的给定凭据,呼叫已通过。但是,您总是需要以这种方式两次调用提供程序:第一次是获取它使用 BasicAuth 的信息,第二次是实际进行调用。
有没有办法在第一次调用时直接给出认证信息?
可以直接在请求中添加授权header
let auth = new Soup.AuthBasic()
auth.authenticate("xxx","xxx");
message.request_headers.append("Authorization",auth.get_authorization(message))
这可以防止未经授权的第一个请求 header 并且还允许使用 REST 服务,这些服务在未经授权的请求上 return 没有正确的状态代码,而是转发到登录页面。
作为 gnome-shell 扩展的一部分,我尝试使用 xmlrpc 使用 Web 服务。 Web 服务需要基本身份验证 header。使用 Soup,我得到了以下代码(基本上是 openweather 扩展的蓝图):
function load_json_async() {
if (_httpSession === undefined) {
_httpSession = new Soup.Session();
} else {
// abort previous requests.
_httpSession.abort();
}
let message = Soup.xmlrpc_message_new (
"https://api.sipgate.net/RPC2",
"samurai.BalanceGet",
new GLib.Variant('()',1.0)
)
_httpSession.connect('authenticate',
Lang.bind(
this,function(session,message, auth,retryFlag){
auth.authenticate("xxxxx","xxxxx");
}
)
)
_httpSession.queue_message(
message,
Lang.bind(this,
function(_httpSession, message) {
try {
if (!message.response_body.data) {
log("hello1 "+message.response_body.status)
return;
} else {
log("got message-status:"+message.status_code)
}
log(message.response_body.data)
} catch (e) {
log("exception:"+e)
return;
}
return;
}));
return;
}
我正在使用 Soup 建立连接。在执行 queue-callback 之前执行身份验证信号。
仍然,在回调的开始,response_body 持有状态代码 401 而不是预期的授权。 incorrect.After 更正此问题的给定凭据,呼叫已通过。但是,您总是需要以这种方式两次调用提供程序:第一次是获取它使用 BasicAuth 的信息,第二次是实际进行调用。
有没有办法在第一次调用时直接给出认证信息?
可以直接在请求中添加授权header
let auth = new Soup.AuthBasic()
auth.authenticate("xxx","xxx");
message.request_headers.append("Authorization",auth.get_authorization(message))
这可以防止未经授权的第一个请求 header 并且还允许使用 REST 服务,这些服务在未经授权的请求上 return 没有正确的状态代码,而是转发到登录页面。