在Java中,一切皆对象,即使是涉及到网络编程这块,在Java中也把有关的部分,比如http协议,IO流操作封装为对象来处理。对于Web编程这块,涉及的知识点广而多,今天我们先来讲一下有关HTTP的知识。
一:HTTP
1.1:HTTP协议简介
HTTP是Web应用层协议,全称为超文本传输协议(HyperText Transfer Protocol),它是Web的核心。HTTP由两个程序实现:一个客户程序和一个服务器程序。客户程序和服务器程序运行在不同的端系统中,通过交换HTTP报文进行会话。HTTP定义了这些报文的结构以及客户和服务器进行报文交换的方式。跟HTTP相类似的协议还有SMTP(主要用于邮件传输),FTP(主要用于文件传输)等,他们都是位于OSI网络模型的顶层协议,OSI七层网络模型图可对应如下:
图1:OSI七层模型
Http定义了与服务器交互的不同方法,主要的方法有:GET,POST,PUT,DELET,HEAD,OPTIONS等。一般在浏览器中输入URL地址访问资源是采用GET方法。前面说到,客户端与服务器通过交换Http报文进行会话,那么Http报文的格式是如何的呢?
Http报文主要分为两部分,一个是客户端传送给服务器的请求报文,一个是服务器反馈给客户端的响应报文。
请求报文格式如下:
请求报文分为三部分:请求行,请求头部,请求正文。接下来,我们简单讲解一下这三个(注意上图格式中的空格,换行符,回车符务必要添加)。
请求行:
第一个参数为请求方法,就是上面提到的GET,POST等方法,第二个参数为请求的URL地址,第三个参数为Http版本协议,分为两种Http/1.0和Http/1.1。Http/1.0是以前的版本,现在多用Http/1.1版本。每两个参数之间用空格分开,最后一个参数回车换行。
请求头部:
请求头部是请求报文的一些附属信息。一行表示一组头域,每个头域由一个域名,冒号(:)和域值三部分组成。
常见的请求头部如下:
更详细的请求头部和响应头部对应信息如下:
http://tools.jb51.net/table/http_header
请求正文:
请求正文里面封装了主要的请求信息。对于不用的请求方法,请求正文位置不同。
例如GET请求是没有请求正文的,因为该数据需要封装在请求行的第二个参数URL之后,以?分割URL和传输数据,多个参数之间用&连接,例如https://www.baidu.com/s?tn=80035161_2_dg&wd=get%E8%AF%B7%E6。
如果数据是英文字母/数字,则保持原样发送
如果是空格,则转换为+
如果是中文/其他字符,则需经过加密处理,得出%E8%AF%B7%E6,其中%xx中的xx为该符号以16进制表示的ASCII。
而对于POST方法,这些数据是放在请求正文中的。
最后封装而成的整个请求报文如下:
这个是POST请求的报文,如果是GET的,就要把报文体中的name开始的那一串放在请求URL的后面,两部分以?加以分开。
相对于请求报文而言,响应报文的结构是高度相似的,这里不再赘述,下面给出响应报文的格式:
响应报文中几个要点说明:
1.状态行中的状态码表示此次请求的状态,如返回200,则表示请求成功,如返回404,则表示请求资源不存在。
2.响应正文中是我们所需的请求数据实体
常见的状态码及状态描述对应表可参考下面: