如果你在网站上看我的博客,这篇文章的数据就是你使用http协议从服务器那里得到的
HTTP是什么玩意?
HTTP是超文本传输协议,全称为HyperText Transfer Protocol。HTTP的中文名字叫「超文本传输协议」,它可以拆成三个部分:
- 超文本
- 传输
- 协议
HTTP 协议是互联网用作获取例如 HTML 文档这类资源的基础协议,是网页开发的必备知识,它基于 TCP/IP 协议的应用层协议,是 Web 上进行任何数据交换的基础应用层协议,不涉及数据包(packet)传输。同时,也是一种客户端—服务器(client-server)协议,也就是说,请求是由接受方——通常是浏览器发起的,一个完整网页文档是由获取到的不同文档组件:像是文本、布局描述、图片、视频、脚本等重新构建出来的。主要规定了客户端和服务器之间的通信格式,默认使用80端口。
请求由一个实体,即用户代理(user agent),或是一个可以代表它的代理方(proxy)发出。大多数情况下,这个用户代理都是一个网页浏览器,不过它也可能是任何东西,比如一个爬取网页来充实、维护搜索引擎索引的机器爬虫。每个请求都会被发送到一个服务端,它会处理这个请求并提供一个称作响应的回复。在客户端与服务端之间,还有许许多多的被称为代理的实体,履行不同的作用,例如充当网关或缓存。
基于HTTP的组件系统
用户代理
任何能够代表用户行为的工具,以浏览器为主,也可能是工程师和 Web 开发人员调试应用所使用的那些程序比如爬虫。
web服务端
一个服务端可以是一台机器,也可以是多个设备假装表现为仅有一台机器,但实际上,它可以是共享负载的一组服务器集群(负载均衡)或是其他类型的软件(如缓存、数据库服务、电商服务等),按需完整或部分地生成文档,一个服务器可以不仅仅只有一台机器,而多个服务端软件实例也可部署在同一台机器上。利用 HTTP/1.1 和 Host 标头,它们甚至可以共用同一个 IP 地址。
代理
在浏览器和服务器之间,有许多计算机和设备参与传递了 HTTP 消息。依靠 Web 技术栈的层次化的结构,传递过程中的多数操作都位于传输层、网络层或物理层,它们对于 HTTP 应用层而言就是透明的,并默默地对网络性能产生着重要影响。还有一部分实体在应用层参与消息传递,一般被称为代理(Proxy)。代理可以是透明的,即转发它们收到的请求并不做任何修改,也可以表现得不透明,将它传递给服务端之前使用一些手段修改这个请求。代理可以发挥很多种作用:
- 缓存(可以是公开的也可以是私有的,如浏览器的缓存)
- 过滤(杀毒软件、青年少年模式)
- 负载均衡(不同服务器服务不同的请求)
- 认证(控制对不同资源的访问)
- 日志(使得代理可以存储历史信息)
HTTP常见状态码
1类 | 提示信息,表示目前协议处理的中间状态,还需要后续的操作 | |
2类 | 成功,报文已经收到并被正确处理,这是我们最想看到的 | 200、204、206 |
3类 | 重定向,资源位置发生变动,需要客户端重新发送请求 | 301、302、304 |
4类 | 客户端错误,请求报文有误,服务器无法处理 | 400、403、404 |
5类 | 服务器错误,服务器在处理请求时内部发生了错误 |
200 OK | 是最常见的成功状态码,表示一切正常。如果是非HEAD请求,服务器返回的响应头都会有body数据。 |
204 No Content | 也是常见的成功状态码,与200OK基本相同,但是响应头没有body数据。 |
206 Partial Content | 是应用于HTTP分块下载或断电续传,表示响应返回的body数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态。 |
301 Moved Permanently | 表示永久重定向,说明请求的资源已经不存在了,需改用新的URL再次访问。 |
302 Moved Temporarily | 表示临时重定向,说明请求的资源还在,但暂时需要用另一个URL来访问。301和302都会在响应头里面使用字段Location,指明后续需要跳转的URL,浏览器会自动重定向新的URL. |
304 Not Modified | 不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,用于缓存控制。 |
400 Bad Request | 表示客户端请求的报文有错误,但只是个笼统的错误。 |
403 Forbidden | 表示服务器禁止访问资源,并不是客户端的请求错误。 |
404 Not Found | 表示服务器禁止访问资源,并不是客户端的请求错误。 |
500 Internal Server Error | 与400类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。 |
501 Not Implemented | 表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。 |
502 Bad Gateway | 通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。 |
503 Service Unavailabe | 表示服务器当前很忙,暂时无法响应服务器,类似“网络服务很忙,请稍后重试”的意思。 |
HTTP常见请求头
1、Accept:指定浏览器或其他客户端程序所能处理的MIME类型(IE5和6在重新载入页面时,发送的Accept报头不正确,但在最初的请求中是正确的)。
2、Accept-Charset:标明浏览器可以使用的字符集(如ISO-8859-1).
3、Accept-Encoding:详细列出客户端能处理的编码类型(gzip,compress是两种常见的值),一般来讲花在解码上的时间要远远小于传输的开销。
4、Accept-Language:在servlet能够以多种语言生产结果时,列出客户程序首选的语言。这个报头的值应该是标准语言代码的一种,比如en, en-us, da等。
5、Authorization:在访问密码保护的WEB页面时,客户用这个报头来识别自己的身份。(Https)
6、Connection:标明客户是否能够处理持续性HTTP连接。持续性(Keep-Alive)是默认的选项。
7、Content-Length:只适用于POST请求,用来给定POST数据的大小,以字节为单位。request.getContentlength()方法得到这个报头。(GET的方法不行?)
8、Cookie:这个报头向服务器返回cookie,这些cookie是之前服务器发送给浏览器的。使用request.getCookies读取这个报头。
9、Host:在HTTP1.1中,浏览器和其他客户端程序需要制定这个报头,它标明原始URL中给出的主机名和端口号。
10、If-Modified-Since:这个报头标明,仅当页面在指定日期之后发生更改的情况下,客户程序才希望获取该页面。
11、If-Unmodified-Since:和If-Modified-Since:相反:规定仅当文档比指定的日期要旧时,操作才需要继续。
12、Referer:标明引用Web页面的URL。例如,WEB1单击指向WEB2的链接,在浏览器请求WEB2页面是会把Referer指定为WEB1的URL。
13、Use-Agent:标识生产请求的浏览器或其他客户端程序,根据这个报头,可以针对不同类型的浏览器返回不同的内容。