在 tcl 中格式化 HTTP 响应头

Formatting HTTP Response Headers in tcl

我今晚才开始玩 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。我不知道该怎么做。

我试过使用 rest 包,但我也无法让它工作:

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' 来检索 只是 那个令牌密钥,但我没有确定如何在 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 命令,但在长时间 运行 中使用字典访问可能是更好的做法。

文档:dict, http, json package, lindex, package

您可以试试这个代码:

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 [lindex [nessus::login -username admin -password myPassword] 1]