http一问一答

1.用户浏览网站时,发起请求和得到响应的基本过程是什么样的?为什么用户键入一个网址往往会发起多个请求?

首先制作一个非常简单的网页,它的内容只有一行:
<html><body>hello world</body></html>
把它放到WEB服务器上,比如IIS,然后用IE浏览器请求这个页面(http://localhost:8080/simple.htm),当我们请求这个页面时,浏览器实际做了以下四项工作:
1 解析我们输入的地址,从中分解出协议名、主机名、端口、对象路径等部分,对于我们的这个地址,解析得到的结果如下:
协议名:http
主机名:localhost
端口:8080
对象路径:/simple.htm
2 把以上部分结合本机自己的信息,封装成一个HTTP请求数据包
3 使用TCP协议连接到主机的指定端口(localhost, 8080),并发送已封装好的数据包
4 等待服务器返回数据,并解析返回数据,最后显示出来

 

 

2.请求行在请求报文的什么位置,格式是什么样的

HTTP请求和HTTP响应,都称为http消息,包括消息头和消息体。
消息头包括消息行、实体头、头部结束标识;其中实体头又包括通用头、请求头(响应头)、实体头。
    消息体就是HTTP数据体,在RFC2616中称为HTTP Entity,不是必选的。比如HTTP GET请求,就只有请求头,没有请求体。

 

 

3.HTTP目前有哪些版本

HTTP/0.9 已过时。只接受 GET 一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持 POST 方法,所以客户端无法向服务器传递太多信息。
  HTTP/1.0 这是第一个在通讯中指定版本号的HTTP 协议版本,至今仍被广泛采用,特别是在代理服务器中。
    HTTP/1.1 当前版本。持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度。

 

 

4.GET和POST方法的主要区别有哪些,GET请求的参数放在请求报文的什么位置,POST请求的参数放在请求报文的什么位置?

 

http://wenku.baidu.com/view/816f7029915f804d2b16c1ab.html

 

GET请求的参数放在请求报文的什么位置,POST请求的参数放在请求报文的信息头后面的实体中;

 

GET的消息没有消息体,而POST消息是有消息体的,消息体的内容就是要POST的数据。

 

Get:是以实体的方式得到由请求URI所指定资源的信息,如果请求URI只是一个数据产生过程,那么最终要在响应实体中返回的是处理过程的结果所指向的资源,而不是处理过程的描述。

Post:用来向目的服务器发出请求,要求它接受被附在请求后的实体,并把它当作请求队列中请求URI所指定资源的附加新子项,Post被设计成用统一的方法实现下列功能:

1:对现有资源的解释

2:向电子公告栏、新闻组、邮件列表或类似讨论组发信息。

3:提交数据块

4:通过附加操作来扩展数据库

从上面描述可以看出,Get是向服务器发索取数据的一种请求;而Post是向服务器提交数据的一种请求,要提交的数据位于信息头后面的实体中。

 

get方法会在IE地址栏里显示表示你提交时候所带的值

post方法不会

 

1.GET 方法
GET 方法提交数据不安全,数据置于请求行,客户端地址栏可见;
GET 方法提交的数据大小限制在255 个字符之内
GET 方法不可以设置书签
2.POST 方法
POST 方法提交数据安全,数据置于消息主体内,客户端不可见
POST 方法提交的数据大小没有限制
POST 方法可以设置书签

 

get操作是没有body部分的,如果要传递给服务器信息,都在URL中。
而POST、Put、delete是有body部分,如果要传递信息,都放在body中。
但是后来实际使用的时候,很多没有依照原来的意思,只是将post作为复杂和安全的数据传递方法,因为请求的信息是放在body中,所以安全、而且丰富。
而get的请求将信息放在URL中,比如:http://www.xxx.com/query?name=simon&male=m,可以认为是想服务器查询一个名叫simon的信息。

 

GET 请求获取Request-URI所标识的资源。注意:GET方法不应当被用于产生“副作用”的操作中,例如在web app.中。其中一个原因是GET可能会被网络蜘蛛等随意访问。 

  POST 在Request-URI所标识的资源后附加新的数据(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 

                                                                       

5.查询字符串的一般格式是什么?   当遇到空格等特殊字符时一般怎么处理?              

查询字符串其实是传到后台的参数 跟POST请求体里的内容很像

查询字符串是附加在网页URL后从“?”开始直到结尾的一串字符,当浏览器从一个页面重定向到另一个页面时, URL附带查询字符串一并传送到目的页面,因而在目的页面中可以取得查询字符串带过来的信息。

1.构造查询字符串

查询字符串由“属性名=属性值”的格式构成,若有多个属性,属性间用“&”连接,中间不要留有空格。例如以下是附带在一个URL后的查询字符串:

string URL=”WebForm2.aspx?name=张山&No=1000”;

每个属性都是string类型,属性值为字符串常量时并不需要再用“”定界。在这个查询字符串中有2个属性,第一个属性为name,属性值为张山,第二个属性为No,属性值为1000。

因为整个URL和查询字符串一起构成了一个字符串,若查询字符串的某个属性值为变量时,该变量必须是string类型,这时将整个串由几段连接起来就是了。例如上例可以这样表示;

string Name=”张山”;

string Number=”1000”;

string URL=”WebForm2.aspx?name=”+Name+”&No=”+Number;

2.解析查询字符串

当查询字符串随同URL一起被传送到目标页面后,需要将其各个属性值解析出来才能为程序所用。解析的格式是:

Request.Params[“属性名”]。例如解析上例的两个属性值:

string Name=Request.Params["name"];

string Number=Request.Params["No"];

3.查询字符串的应用

    查询字符串的使用简单易行,一般的浏览器和客户端装置都能识别查询字符串。一般限制查询字符串的长度在255个字符之内,因此通过它不能携带过多的信息,也不能携带非字符串类型的信息,同时由于查询字符串可以从浏览器的地址栏中直接看到,其保密性较差。

 

有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了。下表中列出了一些URL特殊符号及编码。

十六进制值

1. + URL 中+号表示空格 %2B

2. 空格 URL中的空格可以用+号或者编码 %20

3. / 分隔目录和子目录 %2F

4. ? 分隔实际的 URL 和参数 %3F

5. % 指定特殊字符 %25

6. # 表示书签 %23

7. & URL 中指定的参数间的分隔符 %26

8. = URL 中指定参数的值 %3D

 

 

详细出处参考:http://www.jb51.net/article/21691.htm

 

昨天收到的一个case说是客户没法查看之前上传的文件,check了一下,发现乱七八糟的文件名里面有#....  - =

因为有之前现成写好的js函数,于是刚开始想在html里打开新页面的herf处套个function,可是不知道是因为页面的html代码是被asp一行行写出来的还是因为那么引用就是不好用....囧(可我在.net里明明就这么用没问题.... - =)好吧,总之这么直接用是行不通的 = =+

后来查了一下asp里面直接就有一个现成的函数可以调用,连改都不用了... orz 

我内牛满面....

 

StrPath=StrPath.replace(" ","%20")

这样就不会在<a href=StrPath>url</a>时发生错误了。当url中存在2个以上space时,此方法失败!

正确方式为:

StrPath=escape(StrPath);

escape方法返回一个包含了 charstring 内容的字符串值( Unicode 格式)。所有空格、标点、重音符号以及其他非 ASCII 字符都用 %xx 编码代替,其中 xx 等于表示该字符的十六进制数。例如,空格返回的是 "%20" 。
字符值大于 255 的以 %uxxxx 格式存储。

 

 

URL中特殊字符的处理

在使用url进行参数传递时,经常会传递一些中文名(或含有特殊字符)的参数或URL地址,在后台处理时会发生转换错误。在有些传递页面使用GB2312,而在接收页面使用UTF8,这样接收到的参数就可能会与原来发生不一致。使用服务器端的urlEncode函数编码的URL,与使用客户端javascript的encodeURI函数编码的URL,结果就不一样。

javascript对文字进行编码涉及3个函数:escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,decodeURIComponent

javaScript中的编码方法:escape() 方法:采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20。unescape方法与此相反。不会被此方法编码的字符: @ * / +
encodeURI()方法:把URI字符串采用UTF-8编码格式转化成escape格式的字符串。不会被此方法编码的字符:! @ # $& * ( ) = : / ; ? + '
encodeURIComponent()方法:把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。不会被此方法编码的字符:! * ( )
因此,对于中文字符串来说,如果不希望把字符串编码格式转化成UTF-8格式的(比如原页面和目标页面的charset是一致的时候),只需要使用escape。如果你的页面是GB2312或者其他的编码,而接受参数的页面是UTF-8编码的,就要采用encodeURI或者encodeURIComponent。
另外,encodeURI/encodeURIComponent是在javascript1.5之后引进的,escape则在javascript1.0版本就有。

1、  传递参数时需要使用encodeURIComponent,这样组合的url才不会被#等特殊字符截断。

   例如:<script language="javascript">document.write('<a href="http://passport.baidu.com/?logout&aid=7&u='+encodeURIComponent("http://cang.baidu.com/bruce42")+'">退出</a>');</script>

2、  进行url跳转时可以整体使用encodeURI

例如:Location.href=encodeURI("http://cang.baidu.com/do/s?word=百度&ct=21");

3、  js使用数据时可以使用escape

例如:搜藏中history纪录。

4、  escape对0-255以外的unicode值进行编码时输出%u****格式,其它情况下escape,encodeURI,encodeURIComponent编码结果相同。

最多使用的应为encodeURIComponent,它是将中文、韩文等特殊字符转换成utf-8格式的url编码,所以如果给后台传递参数需要使用encodeURIComponent时需要后台解码对utf-8支持(form中的编码方式和当前页面编码方式相同)

escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z

encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z

encodeURIComponent不编码字符有71个:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z

以下是url中可能用到的特殊字符及在url中的经过编码后的值:

字符

特殊字符的含义

URL编码

#

用来标志特定的文档位置

%23

%

对特殊字符进行编码

%25

&

分隔不同的变量值对

%26

+

在变量值中表示空格

%2B

/

表示目录路径

%2F

\

表示目录路径

%5C

=

用来连接键和值

%3D

?

表示查询字符串的开始

%3F

空格

空格

%20

.

句号

%2E

:

冒号

%3A

项目中发现,直接对url中的参数部分做encodeURI()编码转换,后台servlet通过getParamater()获取时,不需要转换可以直接获取到正确的值。说明:参数没有用到中文,框架用的是struts框架。

 

 

6.除了GET和POST,还有哪些较为常见的HTTP请求方法?

OPTIONS请求查询服务器的性能,或者查询与资源相关的选项和需求。返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。 

  HEAD 请求获取由Request-URI所标识的资源的响应消息报头。向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。 

  

  PUT 请求服务器存储一个资源,并用Request-URI作为其标识。向指定资源位置上传其最新内容。 

  DELETE 请求服务器删除Request-URI所标识的资源。 

  TRACE 请求服务器回送收到的请求信息,回显服务器收到的请求,主要用于测试或诊断。 

CONNECT 保留将来使用,HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。 

HEAD方法与GET方法几乎是一样的,对于HEAD请求的回应部分来说,它的HTTP头部中包含的信息与通过GET请求所得到的信息是相同的。利用这个方法,不必传输整个资源内容,就可以得到Request-URI所标识的资源的信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新。

7.请求头和请求体如何区分,区分标志是什么?

 

当我们设计一个通信协议时,“消息头/消息体”的分割方式是很常用的,消息头告诉对方这个消息是干什么的,消息体告诉对方怎么干。HTTP传输的消息也是这样规定的,每一个HTTP包都分为HTTP头和HTTP体两部分,后者是可选的,而前者是必须的。每当我们打开一个网页,在上面点击右键,选择“查看源文件”,这时看到的HTML代码就是HTTP的消息体,那么消息头又在哪呢?IE浏览器不让我们看到这部分,但我们可以通过截取数据包等方法看到它。

第一个空行“<CR>”以下的内容就是消息体,这个空行正是HTTP规定的消息头和消息体的分界线。

8.请求头中有哪些常见的头?host、refere、user-agent、cookie的作用是什么?

Host:www.t381.org 告诉服务器,想访问的主机名

Referer:http://www.ti23.org 从哪个资源访问服务器(常用于防盗链)

User-Agent:Mozilla 4.0 告诉客户机的软件环境

Cookie:可以带给服务器客户端的数据

Accept:text/html,image 用于告诉服务器, 客户机支持的数据类型

Accept-Charaset:ISO-8859-1 客户机支持的编码

Accept-Encoding:gzip 客户机支持的数据压缩格式

Accept-Language: zh-cn 客户机支持的语言

Connection:close/Keep-Alive 请求后是关闭,还是保持连接

Date: Tue, 11 Jul 2000 18:30:30 GMT 请求时间

 

响应
HTTP/1.1 200 OK 状态行,200是状态码表示一切OK
Location: http://www.aaa.net 配合http302状态码使用,告诉客户机应该找谁
Server: Microsoft-IIS/5.0  告诉浏览器服务器的类型
Content-Encoding:gzip 数据的压缩格式
Content-Length:告诉浏览器,回送数据的长度
Content-Type:text/html告诉浏览器,回送数据的类型
Refresh:多长时间之后刷新一次
Content-Disposition 控制让浏览器用下载的方式访问资源
Cache-Contorl:no-cache 控制浏览器的缓存

 

9.常见的响应码200、403、404、500、502、503分别代表什么意思?

200 OK      //客户端请求成功; 

400 Bad Request  //客户端请求有语法错误,不能被服务器所理解

401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 

403 Forbidden  //服务器收到请求,但是拒绝提供服务;

404 Not Found  //请求资源不存在,eg:输入了错误的URL ;

405(Method Not Allowed)某个请求所针对的资源不支持对应的请求方法;

500 Internal Server Error //服务器发生不可预期的错误; 

501(Not Implemented)服务器不认识或者不支持对应的请求方法;

503 Server Unavailable    //服务器当前不能处理客户端的请求,一段时间后, 可能恢复正常 
eg:HTTP/1.1 200 OK (CRLF)

posted @ 2014-11-18 08:57  水滴石穿xcj  阅读(660)  评论(0编辑  收藏  举报