HTTP权威指南学习笔记

HTTP权威指南学习笔记(1~4章)

 

一~三章分别讲述了HTTP基本概述,URL与资源,HTTP报文。

第四章讲述了连接管理-TCP的连接概述

 

Web浏览器,服务器和相关的Web应用程序都是通过HTTP相互通信。那么HTTP是什么?

 

QHTTP是什么?

A :HTTP超文本传输协议(HyperText Transfer Protocol),是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。所有WWW文件都必须遵守的规则。HTTP是一个客户端服务器请求和响应的标准(HTTP是建立在TCP/IP协议之上的)。客户端是终端用户,服务器端是网站。

 

简单来说HTTP协议是一种服务器和浏览器之间的一种协议。客户端通过HTTP协议想服务器发起数据请求,服务器根据HTTP请求作出对应响应,返回相应数据。其中一对请求/响应称之为HTTP事务。

 

那么客户端请求的资源一般都是通过HTTP或者HTTPS协议请求的资源由统一资源标示符(Uniform ResourceIdentifiers)(或者,更准确一些,URLs)来标识。

 

因为HTTP是一个客户端服务器请求和响应的标准,那么就要了解请求/响应是如何实现的。

HTTP(包含请求/响应报文)报文是由一行一行的简单字符串构成的。HTTP报文都是纯文本,不是二进制代码。下图简单的表示了一个简单HTTP事务所使用的报文:

客户端发往服务器的HTTP报文成为请求报文(request message)。

服务器发往客户端的报文成为响应报文(response message)。

HTTP请求报文就这两种,没有其他类型的HTTP报文。

 

HTTP报文的组成:

起始行,在请求报文中用来说明要做些什么。响应报文说明出现了什么情况。

首部,起始行后可有两个或多个首部字段,每个首部字段包含一个名字和一个值。

主体,主体部分不是必须内容。请求报文中的主体包含了要发送给Web服务器的数据。响应报文中的主体装载了返回给客户端的数据。

 

PS:起始行和首部都是文本形式且都是结构化的,但是主题可以包含任意的二进制数据(图片,视频,音频,文本)。

 

熟悉了HTTP报文的基本内容,HTTP是应用层协议,那么HTTP的传输是是通过TCP协议(TransmissionControl Protocol)上。网络的基本结构如下图所示,

TCP的几个特性:

·      无差错的数据传输

·   按需传输(数据总是会按照发送的顺序达到)

·   未分段的数据流(可以在任意时刻以任意尺寸将数据发送出去)

 

参看书籍:

·  HTTP Pocket Reference(《HTTP口袋书》)  一本HTTP的快速参考手册

·  http://www.w3.org/History.html 万维网的简要历史

· http://www.w3.org/DesignIssues/Architecture.html  HTTP的概览

 

上一节对HTTP协议的定义,构成,实现有了简单的了解。这一节具体的讲述HTTP协议中获得资源的URL。

QURL的定义与作用是什么?

AURL统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

 

URL的基本结构

<scheme>://<user>:<password>@<host>:<port>/<path>;<param>?<query>#<frag>

对应的中文意义如下:

<协议/方案>://<用户>:<密码>@<主机/域名>:<端口>/<文件路径>;<参数>?<查询参数>#<片段>

URL最重要的三个部分是 <scheme>,<host>,<path>.例如http://www.baidu.com。详细说明如下图

URL的基本格式了解清楚了,那么URL也有两种,绝对URL相对URL

绝对URL指的是一个完整的符合URL格式的URL。

相对URL是不完整的,要从相对URL中获取访问资源的信息,就有一个基础URL作为相对URL的补充部分。

 

URL需要适用于不同的网络协议,那么在字符编码上使用的是通用的。但是有些不安全的字符,需要通过转义来将不安全的字符转为安全的字符来进行传输。这里就引申出来URL的字符集。

 

URL的字符集主要是通过ASCII码来转义。

转义方式为  %后面跟着两个表示字符ASCII码的十六进制数。

 

 

Q:URL的最大长度是多少?

A:HTTP GET方法提交的数据大小长度并没有限制,而是浏览器本身对地址栏URL长度有最大长度限制。

不同浏览器对于URL的最大长度限制不一样。IE支持的是2048个字符。其中IE支持的最少。这里指的字符军事ASCII码。

 

Q:URL含有的中文是乱码怎么办?

A:有三种方式解决问题

1.将字符串转码newString(“xxxxx”.getBytes("iso-8859-1"),"utf-8")

这种转码方式有很大的弊端,因为它是使用指定的字符集将此String编码为byte 序列,并将结果存储到一个新的byte 数组中,然后通过使用指定的字符编码将生成的byte 数组解码,构造一个新的String字符串。这种情况就有可能遇到的情况是,不能将一个汉字全部解码完。这样,前边的都能正常显示,但是最后一个字可能是乱码。

所以不建议使用这种方式。

2.在传参前转码,接收参数后再转码回来。

这种方式有两种:

第一种:

传参前:使用java.net.URLEncoder.encode("xxxx",“utf-8"),将中文转为16进制字符。

接收参数后:使用java.net.URLDncoder.decode("xxxx",“utf-8")将16进制字符转为中文。

这种方式需要注意的是,在使用encode转码后,会出现特殊字符,这时候,就需要将特殊字符替换为相应的16进制。因为特殊字符在url路径中做为参数传递时,也是乱码。

 

第二种:

传参前:encodeURI(“xxxx”)  

接收参数后:使用java.net.URLDncoder.decode("xxxx",“utf-8")将16进制字符转为中文。

这种方式需要注意的是,在使用encodeURI转码后,会出现特殊字符,这时候,就需要将特殊字符也转码,所以使用两次encodeURI,即:

encodeURI(encodeURI(“xxxx”))。

 

PS:两次转码的原理分析:

 

其中具体的原理分析如下,假设页面端输入的中文是一个“中”,按照下面步骤进行解码
1.第一次encodeURI按照utf-8方式获取字节数组变成[-28,-72-83],对字节码数组进行遍历,把每个字节转化成对应的16进制数,这样就变成了[E4,B8,AD],最后变成[%E4,%B8,%AD]

2.第二次encodeURI,把数组最后变成[%25E4,%25B8,%25AD]然后就把处理后的数据[%25E4,%25B8,%25AD]发往服务器端,当应用服务器调用getParameter方法,getParameter方法会去向应用服务器请求参数应用服务器最初获得的就是发送来的[%25E4,%25B8,%25AD],应用服务器会对这个数据进行URLdecode操作,URldecode操作和encodeURL操作是相反的操作,处理结果就是[%E4,%B8,%AD],并把这个值返回给getParameter方法然后再在服务器端中调用相应的URL转码方法或者是函数  就可以把数据还原成最初页面发送过来的中文“中”了。

 

这两种转码方式是很好用的,所以很建议大家使用。

 

3. 修改tomcat配置文件

在Tomcat的安装目录下conf文件夹中的server.xml文件,将配置访问端口的地方加上URIEncoding=“utf8"即可。  <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"URIEncoding="GBK">

 

 

 

 

上面介绍了HTTP的基本概念,URL的基本知识。通过URL来访问资源,那么请求和响应的内容是怎样的?接着来介绍下HTTP请求/响应的的内容。

 

 

HTTP报文

 

Q:什么是HTTP报文流?

A:HTTP报文是在HTTP应用程序之间发送的数据块。这些数据块以一些文本形式的元信息(meta-information)开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分。

 

 

HTTP的组成结构

基本结构为起始行首部、非必要内容主体部分。

HTTP报文又分为请求报文(request message)和响应报文(response message)。基本过程如图所示

两种请求的基本格式

请求报文和响应报文

请求报文的格式                                 响应报文的格式

  

元素的部分简述:

Start-line/起始行的内容:

Method:方法,客户端希望服务器对资源执行的操作。例如有GET/POST/PUT。

Request-URL:请求URL,命名了请求资源的路径。

Version:报文所使用的HTTP版本。

Status-code:状态码.这是一个三位数,反映了返回的状态。每个状态吗的第一位数字用语描述状态的一般类别。

Reason-phrase:数字状态码的可读版本。

Header:首部

Entity/实体部分:

实体首部,Entity-body:实体的主体部分。

起始行包含的method有如下几种常用的:

其中又以GET/POST使用最为频繁。

GET 方法

请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:

/test/demo_form.php?name1=value1&name2=value2

有关 GET 请求的其他一些注释:

GET请求可被缓存

GET请求保留在浏览器历史记录中

GET请求可被收藏为书签

GET请求不应在处理敏感数据时使用

GET请求有长度限制

GET请求只应当用于取回数据

 

POST 方法

请注意,查询字符串(名称/值对)是在 POST 请求的 HTTP消息主体中发送的:

POST/test/demo_form.php HTTP/1.1

Host:w3cschool.cc

name1=value1&name2=value2

有关 POST 请求的其他一些注释:

POST请求不会被缓存

POST请求不会保留在浏览器历史记录中

POST不能被收藏为书签

POST请求对数据长度没有要求

 



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值