如何通过 cURL 发送 etag? cURL 也可以像 COOKIEJAR 一样保存 etag 吗?
从标题中我看到了这个
我的 GET 请求
GET /Vpreviews/p/8b329b598fcdad4fd33432e78128da48f7219882.fll? e=1332973900&ri=4500&rs=75&h=bca0ce28998e637f27cf1d5c7042e7a0 HTTP/1.1
Host: veoh-139.vo.llnwd.net
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0.1) Gecko/20100101 Firefox/8.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
DNT: 1
Connection: keep-alive
服务器响应
HTTP/1.1 200 OK
Server: Veoh-1.5 (lighttpd-1.4.18)
Content-Type: video/x-flv
Accept-Ranges: bytes
Etag: "8b329b598fcdad4fd33432e78128da48f72198829640882"
User-Header: X-llnw-rate-limit: ri=4500, rs=98
Age: 162476
Date: Wed, 28 Mar 2012 22:06:41 GMT
Last-Modified: Sun, 01 Jan 2012 13:29:44 GMT
Expires: Mon, 27 Mar 2017 06:02:35 GMT
Content-Length: 9640882
Connection: keep-alive
看看这个Railscast。 在演示笔记中,您可以看到使用curl 抓取带有cookie 和ETag 的页面的示例。
基本上,您可以使用“If-None-Match”标头传递它:
curl -I http://localhost:3000/books/1 --header 'If-None-Match: "0f46357eafa5c719e8e3bf277a993e07"'
首先,Curl 只是一个执行 http 请求的实用程序。它不会自动记录响应头,例如 Cookie 或 ETag 头。
但是,例如,您可以使用
--dump-header
选项将标头写入文件,并从转储文件中提取所需的标头,然后在下一个请求中使用它。
curl --dump-header header_dump www.google.no
至于发送 ETag,我猜你想执行一个条件 GET 请求。也就是说,您想要指示服务器(或者实际上是应用程序)您只对 200 OK 响应感兴趣(如果资源自上次请求以来已被修改)。
如果这就是您想要的,您可以通过将 If-None-Match: 标头添加到请求中来实现:
curl -I -v --header 'If-None-Match: "1d30-4c993ec28581d"' http://httpd.apache.org
请注意上面的标头如何用单引号引起来,而 Etag 值如何用双引号引起来。除非你这样做,否则它不会起作用。
如果 Etag 匹配,您应该会收到如下 304 响应:
HTTP/1.1 304 Not Modified
Date: Tue, 18 Sep 2012 11:02:17 GMT
Server: Apache/2.4.1 (Unix) OpenSSL/1.0.0g
ETag: "1d30-4c993ec28581d"
Etag 只是一个 Http 请求标头,就像从curls 的角度来看的任何其他标头一样。
所以你可以使用:
curl -v -H 'If-None-Match: 123456789' http:your.server.com/your/path/here
其中 123456789 是您从第一次请求中返回的 Etag 值。
Curl 现在有
--etag-save
和 --etag-compare
https://curl.se/docs/manpage.html#--etag-compare
从 7.70.0
开始,您应该可以一起使用这些curl --etag-compare etag.txt --etag-save etag.txt http://example.org