在tcl中格式化HTTP响应头

在tcl中格式化HTTP响应头,tcl,httpresponse,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 -q

今晚我刚开始和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
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]
我假设这可能比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命令,但从长远来看,使用字典访问可能是更好的做法

文档:,包,

您可以尝试以下代码:

% puts $token
token ba9c5b4256ef701bf7d8ae151c01261cb8a3267f1b8c2787
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开局不错。“我很想听听您学习该语言的动机,以及您对该语言的印象。”glennjackman一位客户周四打电话来寻求我们API的支持。我对curl和Python的API有相当好的理解,只是想帮助客户。我想这将是一个不错的周末项目:。至于我的印象,到目前为止,我很喜欢它,我想一旦我学会了更多的语法,我会非常喜欢它。我喜欢把我所有的电话都组织成自己的方式,在tcl中仍在努力,但我会掌握窍门的。这非常有效!在获取更多命令以使用令牌时遇到一些问题,但重要的是我将其存储起来。非常感谢。我只能将其中一个标记为正确,但我想让您知道,您的代码也适用于我代码的其余部分!