HTTP获取请求tcl

时间:2015-08-05 17:40:20

标签: url https tcl

我在tcl 8.6工作,我正在尝试向google发送get请求。 以下是我使用过的代码:

我的问题是如何使用tcl向Google发送get请求?

package require http
::http::config -useragent "Mozilla/5.0"

set url http://www.google.com

set http [::http::geturl $url]
set html [::http::data $http]

return $html

1 个答案:

答案 0 :(得分:1)

您可以将此包装用于http::geturl

package require uri
proc geturl_followRedirects {url args} {
    array set URI [::uri::split $url]
    for {set i 0} {$i < 5} {incr i} {
        set token [::http::geturl $url {*}$args]
        if {![string match {30[1237]} [::http::ncode $token]]} {return $token}
        array set meta [string tolower [set ${token}(meta)]]
        if {![info exist meta(location)]} {
            return $token
        }
        array set uri [::uri::split $meta(location)]
        unset meta
        if {$uri(host) eq {}} {set uri(host) $URI(host)}
        # problem w/ relative versus absolute paths
        set url [::uri::join {*}[array get uri]]
    }
}

该命令由Donal Fellows和Keith Vetter original完成。我更新了一下以利用Tcl 8.6。它还可以检查最多5次而不是无限期。我还提出了Paul Walton的建议。

该命令返回一个http令牌,就像http::geturl一样,并采用与该命令相同的参数。

ivan73指出,此代码具有以下限制:重定向网址将被大小写转换损坏。可以说,网址很少使用大写字母,但它仍然是一个限制。我想这不是

        array set meta [string tolower [set ${token}(meta)]]
        if {![info exist meta(location)]} {
            return $token
        }
        array set uri [::uri::split $meta(location)]
        unset meta

可以使用

        set location [lmap {k v} [set ${token}(meta)] {
            if {[string match -nocase location $k]} {set v} continue
        }]
        if {$location eq {}} {
            return $token
        }
        array set uri [::uri::split $location]

表示不区分大小写的匹配,它保留元结构的值(和键)。