URL与URI
- URI(Uniform Resource Identifier):统一资源标识符
- URL(Uniform Resource Locator):统一资源定位符
URN(Uniform Resource Name):统一资源名称
URI、URL与URN三者关系如下:
- URL是URI的一种,不仅标识了Web 资源,还指定了操作或者获取方式,同时指出了主要访问机制和网络位置。
- URN是URI的一种,用特定命名空间的名字标识资源。使用URN可以在不知道其网络位置及访问方式的情况下讨论资源。
下面我们来看一个例子:
http://bitpoetry.io/posts/hello.html#intro // URI,包含访问方式,网络位置,资源名
http://bitpoetry.io/posts/hello.html // URL,包含访问方式,网络位置
bitpoetry.io/posts/hello.html#intro // URI,包含名字,但不包括访问方式
HTTP报头
1. 公共头部
字段 | 说明 |
---|---|
Request URL | 请求URL |
Request Method | 页面请求的方式:GET /POST |
Status Code | 状态码,请求的返回状态 |
Remote Address | 请求的远程地址 |
Request Method
HTTP协议的请求方法有GET
、POST
、HEAD
、PUT
、DELETE
、OPTIONS
、TRACE
、CONNECT
。常用有GET
、POST
、HEAD
。GET
:最常见的一种请求方式,当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页的,使用的都是 GET 方式。 GET 方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用 GET 方法时,请求参数和对应的值附加在 URL 后面,利用一个问号?
代表URL的结尾与请求参数的开始,各个参数之间用&
符号隔开,这种方式不适合传送私密数据。传递参数长度受限制,该限制一般为1024字节,与浏览器和操作系统有关,需要传送大量数据的时候,不适合使用GET方式。POST
:使用 POST 方法可以允许客户端给服务器提供信息较多。 POST 方法将请求参数封装在 HTTP 请求数据中,以名称/值的形式出现,可以传输大量数据,这样 POST 方式对传送的数据大小没有限制,而且也不会显示在 URL 中。 POST 方式请求行中不包含数据字符串,这些数据保存在”请求内容”部分,各数据之间也是使用&
符号隔开。 POST 方式大多用于页面的表单中。因为 POST 也能完成 GET 的功能,因此多数人在设计表单的时候一律都使用 POST 方式,其实这是一个误区。 GET 方式也有自己的特点和优势,我们应该根据不同的情况来选择是使用 GET 还是使用 POST 。HEAD
:HEAD 就像 GET ,只不过服务端接受到 HEAD 请求后只返回响应头,而不会发送响应内容。当我们只需要查看某个页面的状态的时候,使用 HEAD 是非常高效的,因为在传输的过程中省去了页面内容。
Status Code
状态码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。
- 1xx:指示信息--表示请求已接收,继续处理。
- 2xx:成功--表示请求已被成功接收、理解、接受。
- 3xx:重定向--要完成请求必须进行更进一步的操作。
- 4xx:客户端错误--请求有语法错误或请求无法实现。
- 5xx:服务器端错误--服务器未能实现合法的请求。
常见状态代码、状态描述的说明如下。更多状态代码详见 状态代码
- 200 OK:客户端请求成功。
- 400 Bad Request:客户端请求有语法错误,不能被服务器所理解。
- 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
- 403 Forbidden:服务器收到请求,但是拒绝提供服务。
- 404 Not Found:请求资源不存在,举个例子:输入了错误的URL。
- 500 Internal Server Error:服务器发生不可预期的错误。
- 503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,举个例子:HTTP/1.1 200 OK(CRLF)。
请求头
字段 | 说明 |
---|---|
Accept | 表示浏览器支持的 MIME 类型 |
Accept-Encoding | 浏览器支持的压缩类型 |
Accept-Language | 浏览器支持的语言类型,并且优先支持靠前的语言类型 |
Cache-Control | 指定请求和响应遵循的缓存机制 |
Connection | 当浏览器与服务器通信时对于长连接如何进行处理:close/keep-alive |
Cookie | 向服务器返回cookie,这些cookie是之前服务器发给浏览器的 |
Host | 请求的服务器URL |
Referer | 该页面的来源URL |
User-Agent | 用户客户端的一些必要信息 |
Accept
Accept 表示浏览器支持的 MIME 类型;格式为:
[<type>/<subtype>,]*<type>/<subtype>
更多MIME详见:MIMECache-Control
Cache-Control 指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置 Cache-Control 并不会影响到另一个消息处理过程中的缓存处理过程。- 请求时的缓存指令包括:
no-cache
,no-store
,max-age
,max-stale
,min-fresh
,only-if-cached
。 - 响应消息中的指令包括:
public
,private
,no-cache
,no-store
,no-transform
,must-revalidate
,proxy-revalidate
,max-age
。
Public
:指示响应可被任何缓存区缓存。Private
:指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当前用户的部分响应消息,此响应消息对于其他用户的请求无效。no-cache
:指示请求或响应消息不能缓存no-store
:用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。max-age
:指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。min-fresh
:指示客户机可以接收响应时间小于当前时间加上指定时间的响应。max-stale
:指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
- 请求时的缓存指令包括:
User-Agent
User-Agent 的值是:用户使用的客户端的一些必要信息,比如操作系统、浏览器及版本、浏览器渲染引擎等。
返回头
字段 | 说明 |
---|---|
Cache-Control | 告诉浏览器或者其他客户,什么环境可以安全地缓存文档 |
Connection | 当client和server通信时对于长链接如何进行处理 |
Content-Encoding | 数据在传输过程中所使用的压缩编码方式 |
Content-Type | 数据的类型 |
Date | 数据从服务器发送的时间 |
Expires | 应该在什么时候认为文档已经过期,从而不再缓存它? |
Server | 服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置 |
Set-Cookie | 设置和页面关联的cookie |
Transfer-Encoding | 数据传输的方式 |
Transfer-Encoding
Transfer-Encoding 的可选值有:
chunked
,identity
,从字面意义可以理解,前者指把要发送传输的数据切割成一系列的块数据传输,后者指传输时不做任何处理,自身的本质数据形式传输。举个例子,如果我们要传输一本“红楼梦”小说到服务器,chunked
方式就会先把这本小说分成一章一章的,然后逐个章节上传,而identity
方式则是从小说的第一个字按顺序传输到最后一个字结束。Content-Type
MediaType,即是 Internet Media Type,互联网媒体类型;也叫做 MIME 类型,在 Http 协议消息头中,使用 Content-Type 来表示具体请求中的媒体类型信息。HTTP Content-Type
请求实例
下面我们来看一下请求的实例:
请求头
Accept:*/*
:支持任何格式返回Content-Type:application/x-www-form-urlencoded; charset=UTF-8
:指定请求的文件类型以及编码在提交表单的时候,form 表单参数中会有一个 enctype 的参数。enctype 指定了 HTTP 请求的 Content-Type。
默认情况下,HTML 的 form 表单的 enctype=application/x-www-form-urlencoded。
application/x-www-form-urlencoded 是指表单的提交,并且将提交的数据进行 urlencode,x-www-form-urlencoded 的编码方式把 form 数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串append到url后面。如果要在表单中上传文件,一般会将 form的enctype 参数设置为 multipart/form-data。这种方式只支持POST的请求方式。
Contype-Type=multipart/form-data 情况的时候,都会通过一个特殊的字符串来将原始 POST 数据进行分割。如图:Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
:指定接受的语言类型,q=0.8
,表示权重。具体参见HTTP Transfer ProtocolContent-Length:32
:请求内容长度,即seqs=lijiang_11908&sortType=none
长度。x-requested-with:XMLHttpRequest
:表明是Ajax异步。