您的位置:首页 > 理论基础 > 计算机网络

第6章HTTP

2016-04-13 10:14 495 查看

第6章 HTTP

HTTP协议

HTTP指定客户端与服务器如何建立连接,客户端如何从服务器请求数据,服务器如何响应请求,以及最后如何关闭连接。HTTP连接使用TCP/IP来传输数据。对于从客户端到服务器的每一个请求,都有4个步骤:

1.默认情况下,客户端在端口80打开与服务器的一个TCP连接,URL中还可以指定其他端口。

2.客户端向服务器发送消息,请求指定路径上的资源。这个请求包括一个首部,可选地(取决于请求的性质)还可以有一个空行,后面是这个请求的数据。

3.服务器向客户端发送响应。响应以响应吗开头,后面是包含元数据的首部、一个空行以及所请求的文档或错误消息。

4.服务器关闭连接

每个请求和响应都哟同样的基本形式:一个首部行,一个包含元数据的HTTP首部、一个空行,然后是一个消息体。一般的客户端请求如下所示:

GET /index.html HTTP/1.1

*第一行称为请求行,包括一个方法、资源的路径以及HTTP的版本。

User-Agent: Mozilla/5.0 (Macintosh: Intel Mac OS X 10.8; rv:20.0)

Gecko/20100101 Firefox/20.0

*User-Agent让服务器知道使用什么浏览器

Host: en.wikipedia.org

*Host域指定服务器的名,允许Web服务器区分来自相同IP地址的不同名的主机

Connection: keep-alive

Accept-Language: en-US,en;q=0.5

Accept-Encoding: gzip,deflate

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

*Accept告诉服务器客户端可以处理哪些数据类型

像这样的GET请求不包含消息体,所有请求以一个空行结束

MIME类型分为两级:类型(type)和子类型(subtype)。

HTML的内容类型是text/html.

8个顶级类型:

1、text/*表示人可读的文字

2、image/*表示图片

3、model/*表示3D模型,如VRML文件

4、audio/*表示声音

5、video/*表示移动的图片,可能包括声音

6、application/* 表示二进制数据

7、message/*表示协议特定的信封,如email消息和HTTP响应

8、multipart/*表示多个文档和资源的容器

服务器看到空行,就开始通过同一个连接向客户端发送它的响应。这个响应以一个状态行开始,后面是一个首部,这个首部采用请求首部同样的“名:值”语法描述响应,然后是一个空行,最后是所请求的资源。

例子:

HTTP/1.1 200 OK

*协议 状态码

Date: Sun, 21 Apr 2013 15:12:46 GMT

*请求的日期

Server: Apache

*服务器软件

Connection: close

*服务器结束发送时关闭连接

Content-Type: text/html; charset=ISO-8859-1

*MIME媒体类型

Content-length: 115

*传输文档的长度,不考虑这个首部

<html>

<head>

<title>

A Sample HTML file

</title>

</head>

<body>

The rest of the document goes here

</body>

</html>

HTTP状态码

1XX 消息

2XX 请求成功

3XX 重地位及重定向

4XX 客户端错误

5XX 服务器错误

Keep-Alive

HTTP 1.0 会为每个请求打开一个新连接。

HTTP 1.1和以后版本中,服务器不必在发送响应后就关闭连接。

客户可以在HTTP请求首部中包括一个Connection字段,指定值为Keep-Alive,指示它希望重用一个socket:

Connection:Keep-Alive

HTTP方法

1、GET

*GET方法可以获取一个资源的表示,没有副作用

2、POST

它也将资源的一个表示上传到已知URL的服务器,但是没有指定服务器如何处理这个新提供的资源。POST要用于不能重复的不安全的操作,如完成一个交易。

3、PUT

*将资源的一个表示上传到已知URL的服务器。有副作用,不过它有幂等性。可以重复这个方法而不用担心它是否失败

4、DELETE

*从一个指定URL删除一个资源。有副作用,但它也是幂等的。将同一个资源删除两次不是错误。

请求主体

例如,下面这个POST请求向服务器发送表单数据:

POST /cgi-bin/register.pl HTTP 1.0

Date: Sun, 27 Apr 2013 12:32:36

Host: www.cafeaulait.org

Content-type: application/x-www-form-urlencoded

Content-length: 54

username=Elliotte+Harold&email=elharo%40ibiblio.org

Cookie

很多网站使用一些小文本串在连接之间存储持久的客户端状态,这些小文本串称为cookie.cookie在请求和响应的HTTP首部,从服务器传递到客户端,再从客户端传回服务器。

cookies只能是非空白符的ASCII文本,不能包含逗号或分号。

要在浏览器中设置一个cookie,服务器会在HTTP首部中包含一个Set-Cookie首部行。例如,下面的HTTP首部将cookie "cart"的值设置为“ATVPDKIKX0DER”:

HTTP/1.1 200 OK

Content-type: text/html

Set-Cookie: cart=ATVPDKIKX0DER

除了简单的name=value时,cookie可以有多个属性来控制它们的作用域,包括过期日期、路径、域、端口、版本和安全选项。

默认情况下,cookie来自哪个服务器就应用于哪个服务器。

Cookie的作用域还受路径限制,默认作用域是最初的URL和所有子目录。可以使用cookie中的Path属性改变默认作用域。

cookie可以同时包括域和路径。

通过将expires属性设置为“Wdy,DD-Mon-YYYY HH:MM:SS GMT”形式的一个日期,可以设置cookie在某个时间点过期。

Max-Age属性可以设置cookie经过一定秒数之后过期。

CookieManager

在Java存储和返回cookie之前,需要先启动cookie:

CookieManager manager = new CookieManager();

CookieHandler.setDefault(manager);

CookieStore

可以用getCookieStore()方法获取这个cookie库,CookieManager就在这里保存它的cookie:

CookieStore store = manager.getCookieStore();

CookieStore类允许你增加、删除和列出cookie,使你能控制在正常HTTP请求和响应流之外发送的cookie
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: