今晚我刚刚开始搞乱 tcl,并且遇到了第一个障碍。这是我的代码:
package require http
package require tls
::http::register https 443 ::tls::socket
set url https://127.0.0.1:8834/session
set body [http::formatQuery username admin password myPassword]
set login [http::geturl $url -query $body]
set authToken [http::data $login]
http::cleanup $token
这是代码运行后 authToken 的样子:
% puts $authToken
{"token":"d52e61030d93824128cea67e2b99dde6f3fd61b25e9a0440"}
我只需要存储 d52e61030d93824128cea67e2b99dde6f3fd61b25e9a0440 。我不知道该怎么做。
我尝试使用其余包,但我也无法让它工作:
package require rest
package require tls
::http::register https 443 ::tls::socket
set nessus(login) {
url https://127.0.0.1:8834/session
method POST
req_args {username: password:}
}
rest::create_interface nessus
set token [nessus::login -username admin -password myPassword]
这是我运行此代码的输出:
% puts $token
token ba9c5b4256ef701bf7d8ae151c01261cb8a3267f1b8c2787
我猜想,这可能比 http 代码更容易格式化。
在 Python 中,我能够通过从 json 中提取“token”来检索该 token key ,但我不确定如何在 tcl 中实现这一点。
最佳答案
您收到的响应采用 json 对象的形式,具有一个键和一个值。您可以使用 json
包将其转换为 Tcl dict
结构:
package require json
::json::json2dict [http::data $login]
# -> token d52e61030d93824128cea67e2b99dde6f3fd61b25e9a0440
rest
包自动检测 xml 和 json,并且显然在传递之前将接收到的对象转换为 dict
。
您可以通过普通字典访问来获取值:
dict get $token token
# -> ba9c5b4256ef701bf7d8ae151c01261cb8a3267f1b8c2787
# or
dict get [::json::json2dict [http::data $login]] token
# -> d52e61030d93824128cea67e2b99dde6f3fd61b25e9a0440
也可以使用 lindex
命令,但从长远来看,使用字典访问可能是更好的做法。
关于tcl - 在 tcl 中格式化 HTTP 响应 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32775676/