zoukankan      html  css  js  c++  java
  • 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)

    如果有一天我们淹没在茫茫人海中,庸碌一生,那一定是我们没有努力活得丰盛
  • 相关阅读:
    用Fiddler模拟低速网络环境
    定制 Fiddler 之将请求发往另一服务器
    软件测试流程进阶----两年软件测试总结
    Fiddler 4 抓包(APP HTTPS )
    JMeter报错 ERROR o.a.j.t.JMeterThread: Test failed!
    Python显示百分比
    python 2 到 3 的新手坑
    Python运行的17个时新手常见错误小结
    Python去除字符串的空格
    js控制媒体查询样式/判断是PC端还是移动端
  • 原文地址:https://www.cnblogs.com/xiachj/p/4104866.html
Copyright © 2011-2022 走看看