11.3.1. 用户代理 (User-Agent)
User-Agent 是一种客户端告知服务器谁在什么时候通过 HTTP 请求了一个 web 页、feed 汇聚或其他类型的 web 服务的简单途径。当客户端请求一个资源时,应该尽可能明确发起请求的是谁,以便当产生异常错误时,允许服务器端的管理员与客户端的开发者取得联系。
默认情况下 Python 发送一个通用的 User-Agent:Python-urllib/1.15。下一节,您将看到更加有针对性的 User-Agent。
有时资源移来移去。Web 站点重组内容,页面移动到了新的地址。甚至是 web 服务重组。原来位于 http://example.com/index.xml 的 feed 汇聚可能被移动到 http://example.com/xml/atom.xml。或者因为一个机构的扩展或重组,整个域被迁移。例如,http://www.example.com/index.xml 可能被重定向到 http://server-farm-1.example.com/index.xml。
您每次从 HTTP 服务器请求任何类型的资源时,服务器的响应中均包含一个状态代码。状态代码 200 的意思是 “一切正常,这就是您请求的页面”。状态代码 404 的意思是 “页面没找到”。 (当浏览 web 时,你可能看到过 404 errors。)
HTTP 有两种不同的方法表示资源已经被移动。状态代码 302 表示临时重定向;这意味着 “哎呀,访问内容被临时移动” (然后在 Location: 头信息中给出临时地址)。状态代码 301 表示永久重定向;这意味着 “哎呀,访问内容被永久移动” (然后在 Location: 头信息中给出新地址)。如果您获得了一个 302 状态代码和一个新地址,HTTP 规范说您应该使用新地址获取您的请求,但是下次您要访问同一资源时,应该使用原地址重试。但是如果您获得了一个 301 状态代码和一个新地址,您应该从此使用新地址。
当从 HTTP 服务器接受到一个适当的状态代码时,urllib.urlopen 将自动 “跟踪” 重定向,但不幸的是,当它做了重定向时不会告诉你。
你将最终获得所请求的数据,却丝毫不会察觉到在这个过程中一个潜在的库 “帮助” 你做了一次重定向操作。因此你将继续不断地使用旧地址,并且每次都将获得被重定向的新地址。这一过程要往返两次而不是一次:太没效率了!本章的后面,您将看到如何改进这一点,从而适当地且有效率地处理永久重定向。
11.3.3. Last-Modified/If-Modified-Since
有些数据随时都在变化。CNN.com 的主页经常几分钟就更新。另一方面,Google.com 的主页几个星期才更新一次 (当他们上传特殊的假日 logo,或为一个新服务作广告时)。
Web 服务是不变的:通常服务器知道你所请求的数据的最后修改时间,并且 HTTP 为服务器提供了一种将最近修改数据连同你请求的数据一同发送的方法。
如果你第二次 (或第三次,或第四次) 请求相同的数据,你可以告诉服务器你上一次获得的最后修改日期:在你的请求中发送一个 If-Modified-Since 头信息,它包含了上一次从服务器连同数据所获得的日期。如果数据从那时起没有改变,服务器将返回一个特殊的 HTTP 状态代码 304,这意味着 “从上一次请求后这个数据没有改变”。这一点有何进步呢?当服务器发送状态编码 304 时,不再重新发送数据。您仅仅获得了这个状态代码。所以当数据没有更新时,你不需要一次又一次地下载相同的数据;服务器假定你有本地的缓存数据。
所
有现代的浏览器都支持最近修改 (last-modified)
的数据检查。如果你曾经访问过某页,一天后重新访问相同的页时发现它没有变化,并奇怪第二次访问时页面加载得如此之快——这就是原因所在。你的浏览器首次
访问时会在本地缓存页面内容,当你第二次访问,浏览器自动发送首次访问时从服务器获得的最近修改日期。服务器简单地返回 304: Not Modified (没有修改),因此浏览器就会知道从本地缓存加载页面。在这一点上,Web 服务也如此智能。
Python 的 URL 库没有提供内置的最近修改数据检查支持,但是你可以为每一个请求添加任意的头信息并在每一个响应中读取任意头信息,从而自己添加这种支持。
11.3.4. ETag/If-None-Match
ETag 是实现与最近修改数据检查同样的功能的另一种方法:没有变化时不重新下载数据。其工作方式是:服务器发送你所请求的数据的同时,发送某种数据的 hash (在 ETag 头信息中给出)。hash 的确定完全取决于服务器。当第二次请求相同的数据时,你需要在 If-None-Match: 头信息中包含 ETag hash,如果数据没有改变,服务器将返回 304 状态代码。与最近修改数据检查相同,服务器仅仅 发送 304 状态代码;第二次将不为你发送相同的数据。在第二次请求时,通过包含 ETag hash,你告诉服务器:如果 hash 仍旧匹配就没有必要重新发送相同的数据,因为你还有上一次访问过的数据。
Python 的 URL 库没有对 ETag 的内置支持,但是在本章后面你将看到如何添加这种支持。
最
后一个重要的 HTTP 特性是 gzip 压缩。 关于 HTTP web 服务的主题几乎总是会涉及在网络线路上传输的 XML。XML
是文本,而且还是相当冗长的文本,而文本通常可以被很好地压缩。当你通过 HTTP
请求一个资源时,可以告诉服务器,如果它有任何新数据要发送给我时,请以压缩的格式发送。在你的请求中包含 Accept-encoding: gzip 头信息,如果服务器支持压缩,它将返回由 gzip 压缩的数据并且使用 Content-encoding: gzip 头信息标记。
Python 的 URL 库本身没有内置对 gzip 压缩的支持,但是你能为请求添加任意的头信息。Python 还提供了一个独立的 gzip 模块,它提供了对数据进行解压缩的功能。
注意我们用于下载 feed 汇聚的小单行脚本并不支持任何这些 HTTP 特性。让我们来看看如何改善它。
分享到:
相关推荐
06. 05 HTTP模块:HTTP特性 07. 06 HTTP模块:报文结构 08. 07 HTTP模块:状态码 09. 08 HTTP模块:HTTP首部字段-上 10. 09 HTTP模块:HTTP首部字段-下 11. 10 HTTP模块:HTTPS协议 12. 11 HTTP模块:HTTP认证...
进入4.3.x阶段,HTTPCore开始集成更多现代HTTP特性和最佳实践,比如HTTP/1.1的完全支持和对HTTP/2的初步尝试。4.3.2可能是针对4.3.0和4.3.1的改进版本,解决了用户反馈的问题。 4.4.x系列是HTTPCore的一个重要里程...
HTTP协议相关技术补充部分涉及了基础概念、协议分析的优势、HTTP协议的安全漏洞以及基于HTTP特性的一些攻击构思。例如,HTTP分析器可以用来检测网络攻击,HTTP协议的Content-Length限制漏洞可能被利用造成拒绝服务...
10. **框架集成**:许多.NET框架利用特性来提供功能,例如ASP.NET MVC的`[HttpGet]`、`[Authorize]`等。 掌握自定义特性是提升C#编程能力的关键一步,它允许开发者以声明式的方式为代码添加附加信息,进而实现灵活...
本篇文章主要介绍了 HTTP 基础知识,包括 HTTP 的基本概念、Get 与 Post、HTTP 特性、HTTPS 与 HTTP、HTTP/1.1、HTTP/2、HTTP/3 演变等。 HTTP 基本概念 ---------------- HTTP 是超文本传输协议,英文全称为 ...
Nginx 支持基本的 HTTP 特性,包括: * 处理静态文件、索引文件和自动索引 * 打开文件描述符缓存 * 使用缓存加速反向代理 * 简单负载均衡和容错 * 远程 FastCGI、uwsgi、SCGI 和 memcached 服务的缓存加速支持 * ...
这些库不仅性能更优,而且提供了更好的错误处理机制和现代HTTP特性的支持,比如异步请求、自动重试和连接池管理。 在进行迁移的过程中,需要注意以下几点: 1. **理解新API**:了解HttpURLConnection的工作原理和...
2. **确保命名空间兼容性**:通常情况下,还需要为Web服务添加`[WebService(Namespace="http://tempuri.org/")]`特性,以确保命名空间的兼容性。 3. **绑定到WSI标准**:可选地,为了符合WS-I Basic Profile 1.1标准...
在C#编程中,"标签特性"(Attribute)是一种元数据,可以附加到代码的不同元素(如类、方法、属性等)上,提供额外的信息。这些特性在编译时不会影响程序的行为,但在运行时可以通过反射来访问和利用。本案例“c#...
尽管thttpd功能相对简单,但它支持基本的HTTP特性,如GET、POST请求、静态文件服务、HTTPS(通过SSL/TLS)和基本的URL重定向。对于那些不需要高级特性和模块化扩展的场合,thttpd是一个非常实用的选择。不过,由于其...
HttpClient 4.5与OkHttp、Retrofit等其他HTTP客户端相比,具有更丰富的HTTP特性支持,尤其在企业级应用中,其强大的连接管理和安全性配置更受青睐。然而,对于轻量级应用,OkHttp等可能更简洁易用。 总结,...
其中最重要的新特性是HTTP客户端API,它提供了一个内置的HTTP客户端,使得开发者可以方便地进行HTTP和HTTPS请求。此外,JEP 320移除了对Java Applet的支持,反映了浏览器安全趋势的变化。同时,JDK 11还引入了改进的...
### Java 9 新特性大全详解 #### 一、概述 Java 9 是 Oracle 在 2017 年 7 月发布的重大版本更新,它不仅引入了许多令人兴奋的新功能和改进,还对 Java 平台的整体架构进行了优化。本文将详细介绍 Java 9 中的关键...
在使用这些库时,开发者需要注意版本兼容性,因为较旧的版本可能不支持最新的HTTP特性或安全更新。同时,随着技术的发展,Apache已经推出了更现代的HTTP客户端库,如HttpComponents HttpClient 4.x系列,它提供了更...
4. **HTTP增强**:Java 6中的`java.net.URLConnection`类得到了增强,提供了对HTTP/1.1协议更全面的支持,包括连接池、HTTP头部缓存以及基本的认证机制。这改进了网络I/O性能,降低了网络延迟。 5. **...
dynamic obj = new System.Uri("http://www.example.com"); string host = obj.Host; // 正常工作 ``` 在这个例子中,`obj`被声明为`dynamic`类型,这意味着即使在编译时不明确知道`obj`的具体类型,也可以直接访问...
ARQ API 提供了多种高级HTTP特性和功能,如异步请求处理、连接管理、支持HTTP/1.1和HTTP/2协议,以及支持HTTPS和WebSocket。它还允许自定义请求和响应处理,为开发者提供了高度的灵活性。ARQ 2.8.3 版本可能是为了...
通过实现`AsyncContext`接口,Servlet可以将控制权交还给容器,然后在后台执行长时间运行的任务,而不会阻塞HTTP线程。这提高了系统的并发性能,特别是在处理I/O密集型任务时。 3. **微容器(Nested Containers)**...
Spring2.5引入了一个新的Web控制器模型,它允许开发者将HTTP请求直接映射到加注解的方法上。例如,使用@Controller和@RequestMapping注解,可以简化控制器类和处理请求的方法的定义,提高代码的可读性和模块化。 **...