Wget vs Curl:使用禁止的403错误获取站点输出

时间:2013-06-07 13:12:36

标签: curl wget

我使用以下命令:

wget --no-check-certificate“https://www.googleapis.com/youtube/v3/search?alt=json&q=hello&part=snippet

我得到403 Forbidden错误(这是预期的输出),但是还有一个伴随的服务器响应,因为我无法获得。我尝试了各种选项 - 忽略内容长度,提供私有PEM证书,设置用户代理等,但仍然无法获得该输出。

然而,使用curl,输出符合预期。 卷曲“https://www.googleapis.com/youtube/v3/search?alt=json&q=hello&part=snippet

Wget输出:

--2013-06-07 18:37:13--  https://www.googleapis.com/youtube/v3/search?alt=json&q=hello&part=snippet
Resolving www.googleapis.com (www.googleapis.com)... 74.125.135.95, 2404:6800:4001:c01::5f
Connecting to www.googleapis.com (www.googleapis.com)|74.125.135.95|:443... connected.
WARNING: The certificate of `www.googleapis.com' is not trusted.
WARNING: The certificate of `www.googleapis.com' hasn't got a known issuer.
HTTP request sent, awaiting response... 403 Forbidden
2013-06-07 18:37:14 ERROR 403: Forbidden.

卷曲输出:

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "dailyLimitExceededUnreg",
    "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.",
    "extendedHelp": "https://code.google.com/apis/console"
   }
  ],
  "code": 403,
  "message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup."
 }
}

问题是我的许多机器只安装了wget,所以这对我来说是个烦人的问题。我几乎可以肯定我错过了一些让wget显示输出的选项。如果您有任何想法,我很乐意尝试一下。 感谢。

1 个答案:

答案 0 :(得分:2)

不幸的是,您使用wget时运气不佳。

wget程序仅处理HTTP协议版本1.0。在HTTP 1.1中,可以使用chunked编码发送回复。这意味着任一代理都可以在块之前发送数据,每个块之前发送的块大小。这在发送大量数据时是有意义的,或者是提前未知大小的数据。除此之外,chunked编码还允许您移动到正在传输的资源的不同部分。

在您的案例中发生的事情是,当您尝试通过HTTP/1.0与Youtube交谈时,服务器会回答说您运气不好。当您通过HTTP/1.1与它交谈时,它会为您提供包含您看到的JSON的分块响应。 curl处理HTTP/1.1,因此会处理Youtube提供的chunked转移编码。 This Youtube clip让您快速了解分块编码。

最后,以下内容有点偏离主题:分块转移编码和随后的范围请求和响应相当复杂。 Kit剑桥做了really nice presentation on them