在tcl中格式化HTTP响应标头

时间:2015-09-25 05:52:47

标签: tcl httpresponse

我今晚刚刚开始搞乱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'来检索只是那个令牌密钥,但我不知道如何在tcl中完成它。

2 个答案:

答案 0 :(得分:3)

您获得的响应是​​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命令,但从长远来看,使用字典访问可能会更好。

文档:dicthttpjson包,lindexpackage

答案 1 :(得分:1)

您可以尝试以下代码:

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]