ZetCode

Tcl http 包

最后修改日期:2025 年 4 月 21 日

Tcl 的 http 包提供了发送 HTTP 请求的功能。它允许 Tcl 程序与 Web 服务器和 API 进行交互。该包支持 GET、POST 和其他 HTTP 方法。

基本定义

http 包是 Tcl 标准库的一部分。在使用前必须使用 package require http 加载。该包同时支持同步和异步请求功能。

主要命令包括用于发起请求的 ::http::geturl 和用于访问响应数据的 ::http::data。该包处理头信息、超时和其他 HTTP 特性。

简单的 GET 请求

此示例演示了如何进行基本的 GET 请求以获取网页内容。

get_request.tcl
package require http

set url "http://example.com"
set token [::http::geturl $url]
set data [::http::data $token]
puts "Response data length: [string length $data]"
::http::cleanup $token

此代码获取 example.com 的内容。geturl 命令返回一个用于访问响应数据的令牌。始终调用 cleanup 来释放资源。

处理响应标头

此示例展示了如何从请求中访问 HTTP 响应头信息。

response_headers.tcl
package require http

set token [::http::geturl "http://example.com"]
set headers [::http::meta $token]

# Print headers (dictionary format)
puts "Headers:"
foreach {key value} $headers {
    puts "$key: $value"
}

::http::cleanup $token

meta 命令将响应头信息作为字典返回,该字典包含键值对。我们使用 foreach 遍历这些对,并显示内容类型、服务器信息和缓存指令等详细信息。

带数据的 POST 请求

此示例演示了如何发送带表单数据的 POST 请求。

post_request.tcl
package require http

set url "http://httpbin.org/post"
set query [::http::formatQuery username testuser password s3cr3t]
set token [::http::geturl $url -method POST -query $query]
puts [::http::data $token]
::http::cleanup $token

formatQuery 为 POST 请求编码表单数据。-method 选项指定 POST,而 -query 提供数据。httpbin.org 会回显收到的数据。

处理错误

本示例展示了 HTTP 请求的正确错误处理。

error_handling.tcl
package require http

set url "http://nonexistent.example.com"
if {[catch {::http::geturl $url -timeout 3000} token]} {
    puts "Error: $token"
} else {
    if {[::http::ncode $token] != 200} {
        puts "HTTP error: [::http::code $token]"
    }
    ::http::cleanup $token
}

catch 处理连接错误,而 ncode 检查 HTTP 状态码。-timeout 选项可以防止在服务器无响应时挂起。

异步请求

此示例演示了如何进行异步 HTTP 请求。

async_request.tcl
package require http

proc callback {token} {
    set data [::http::data $token]
    puts "Received [string length $data] bytes"
    ::http::cleanup $token
}

set url "http://example.com"
set token [::http::geturl $url -command callback]
puts "Request sent, waiting for response..."
vwait forever

-command 选项指定一个回调函数,用于异步处理响应。vwait 保持程序运行直到回调完成。这可以避免阻塞主线程。

设置请求头

此示例展示了如何为请求设置自定义 HTTP 头信息。

request_headers.tcl
package require http

set url "http://httpbin.org/headers"
set headers [list User-Agent "TclHTTPClient/1.0" Accept "application/json"]
set token [::http::geturl $url -headers $headers]
puts [::http::data $token]
::http::cleanup $token

-headers 选项接受一个头-值对的列表。httpbin.org 在其响应中返回接收到的头信息。这对于 API 身份验证和内容协商非常有用。

HTTPS 请求

此示例演示了如何进行安全的 HTTPS 请求。

https_request.tcl
package require http
package require tls

::http::register https 443 ::tls::socket
set token [::http::geturl "https://example.com"]
puts "Status: [::http::status $token]"
puts "Data length: [string length [::http::data $token]]"
::http::cleanup $token

HTTPS 需要 tls 包。http::register 为 HTTPS 连接设置 TLS 处理程序。其余部分就像常规的 HTTP 请求一样工作,但数据是加密的。

最佳实践

本教程通过实际示例介绍了 Tcl 的 http 包,展示了各种 HTTP 操作。该包提供了全面的 Web 客户端功能。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面有十多年的经验。

列出 所有 Tcl 教程