在 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
命令,但在长时间 运行 中使用字典访问可能是更好的做法。
您可以试试这个代码:
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]
我今晚才开始玩 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
命令,但在长时间 运行 中使用字典访问可能是更好的做法。
您可以试试这个代码:
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]