fiddler——http——请求方法、状态码

注意:本章整理内容,参考于小坦克的文章资源:https://www.cnblogs.com/TankXiao/archive/2013/01/08/2818542.html#commonCode

URL详解

URL(Uniform Resource Locator) 地址用于描述一个网络上的资源,  基本格式如下:


schema://host[:port#]/path/.../[?query-string][#anchor]


scheme        指定低层使用的协议(例如:http, https, ftp)

host          HTTP服务器的IP地址或者域名

port#         HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如 http://www.cnblogs.com:8080/

path          访问资源的路径

query-string  发送给http服务器的数据

anchor-       锚,这是一种超链接,只是页面内部的超链接,如果网页很长,而且里面的内容分为N个部分,这样就可以在网页顶部设置一个锚点,

                  方便浏览者点击相应锚点,快速到达本页面相应位置。

               URL中,锚点在最右边,前面有一个字符“#”。


举例:

http://www.mywebsite.com/sj/test/test.aspx?name=sviergn&x=true#stuff

Schema(协议):                 http
host(域名):                   www.mywebsite.com
path(资源路劲):               /sj/test/test.aspx
Query String(参数):           name=sviergn&x=true
Anchor(锚):                   stuff

http请求方法

http协议中定义了几种不同的请求命令,这些命令叫做http方法(http  method)。

每个http请求报文中都包含一个方法,这个方法告诉服务器要执行什么动作。

一个URL地址用于描述一个网络上的资源,而http中的get、post、put、delete就对应着这个资源的查、改、增、删4个操作。

最常见的是get和post:

       get一般用于获取/查询资源信息;

       post一般用于更新资源信息;

 
 

Http协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET,POST,PUT,DELETE.。

 
 

一个URL地址用于描述一个网络上的资源,

而HTTP中的GET, POST, PUT, DELETE就对应着对这个资源的查,改,增,删4个操作。

 
 

我们最常见的就是GET和POST了。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息.



5种常见的http方法包括:

get:请求指定的页面信息,并返回实体主体; head:类似于get请求,只不过返回的响应中,没有具体的内容,用于获取报头; post:向指定资源提交数据进行请求(例如:提交表单或者上传文件),数据被包含在请求体中。 post请求可能会导致新的资源的建立或对已有的资源的修改; put:从客户端向服务器传送的数据,取代指定文档的内容; delete:请求服务器删除指定的页面;

get方法:用户获取资源,常用于向服务器查询某些信息,一般打开网页都是用get方法,因为要从web服务器获取信息。

带参数的get方法:

                                 浏览器可以在get方法中,把数据传递给服务器,数据放在URL的问号(?)后面。

                                 将查询字符串参数追加到URL末尾,一遍将信息发送给服务器。这种方式叫做查询字符串,或者叫query  string。

例如:百度搜索URL如下:

下面为get方法,并带有参数

GET https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=sitehao123&wd=%E4%B8%AD%E5%9B

%BD&rsv_pq=ee5e88db00155eb1&rsv_t=9b46NVmtUvhHk8NuPqytTgFcpScJZfmNOSxhFBaAu5rlcjCsQ9PfON8N98xNepLuQQ&rqlang=cn&rsv_enter=0&rsv_dl=tb&rsv_sug3=10&rsv_sug1=1&rsv_sug7=00

1&prefixsug=%25E4%25B8%25AD%25E5%259B%25BD&rsp=8&rsv_sug9=es_0_1&inputT=10643&rsv_sug4=12203&rsv_sug=9 HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36
Sec-Fetch-User: ?1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Referer: https://www.baidu.com/?tn=sitehao123&H123Tmp=nunew11
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: BIDUPSID=1655D38E3EB9FAF984C3D838C40375AC; PSTM=1564563068; BD_UPN=12314553; BAIDUID=8B7CDF0DBB1D8B4D8DC4288AE32C655B:FG=1; ispeed_lsm=2; MCITY=-%3A; 

BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BDSFRCVID=7AKsJeCCxG3e2tjwgnO1j79umibdsgZhD6873J; H_BDCLCKID_SF=tbAD_CKKf-3bfTuGDJOqKn0thxtX2bjMfbTf_p7F5l8-hCQXDPjf-n-shxTw-

lQCMJ7PBfQaKqcxOKQphPbm5nIXQ48qbpbjb2oiLInN3KJm_UK9bT3v5Duy-tQ42-biW2tH2Mbdax7P_IoG2Mn8M4bb3qOpBtQmJeTxoUJ25DnJhhCGe6D2e5Q3jNLsbtQb26r-3--8-bTVHRDk5-Qo-

4_eqxby26Pf0m3eaJ5n0-nnhnK45-6bbPCgDfCfqRQL2CrbQb3u2p--bK0Ry66jK4JKDG0tJ6OP; H_PS_PSSID=1469_21080_30211_30071_26350; H_PS_645EC=881dEMXJjSRsjFsceTvx5SWR2G

%2FilqMyfp6iGiw%2BDfeUUG0wTEM81HCuM8v1K4C3CQ; delPer=0; BD_CK_SAM=1; PSINO=5; BDSVRTM=113

注意:浏览器可以在get方法中把数据传给服务器,数据放在URL的?后面;

     百度搜索中,查询字符串以名=值这样的形式出现,多个名值之间用&分隔开;

在fiddler中,使用webforms选项卡可以清楚的看到get方法中的字符串查询参数:

post方法

post方法通常用来把表单中填好的数据发送给服务器。

post方法,数据放在body中,不会放在url中。

 

GET和POST的区别

GET和POST的区别:

1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456POST方法是把提交的数据放在HTTP包的Body中.

2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.

3. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。

4. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,

   如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.

===================================================================================================================================

http状态码

http状态码:


每个http响应报文,都会携带一个状态码,用于告诉客户端请求是否成功。状态码是一个3位数字的代码。


http状态码存在于http的响应报文中,其作用是web服务器告诉客户端发生了什么事。


http响应报文中的第一行,由http协议版本号、状态码、状态消息3部分组成。

------------------------------------------------------------------------------------------------------------

Response 消息中的第一行叫做状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。

状态码用来告诉HTTP客户端,HTTP服务器是否产生了预期的Response.

HTTP/1.1中定义了5类状态码, 状态码由三位数字组成,第一个数字定义了响应的类别

1XX:提示信息 - 表示请求已被成功接收,继续处理

2XX:成功 - 表示请求已被成功接收,理解,接受

3XX:重定向 - 要完成请求必须进行更进一步的处理

4XX:客户端错误 -  请求有语法错误或请求无法实现

5XX:服务器端错误 -   服务器未能实现合法的请求

常见的状态码

一般人只需要了解以下常见的状态码就够了, 如果你想了解更多, 请继续往下看。

200               OK 服务器成功处理了请求(这个是我们见到最多的)
301/302        Moved Permanently(重定向)请求的URL已移走。Response中应该包含一个Location URL, 说明资源现在所处的位置
304               Not Modified(未修改)客户的缓存资源是最新的, 要客户端使用缓存
404               Not Found 未找到资源
501               Internal Server Error服务器遇到一个错误,使其无法对请求提供服务

其它详细的状态码,详细见其它参考博客。

2XX 成功状态码

客户端发起请求时, 这些请求通常都是成功的。服务器有一组用来表示成功的状态码,分别对应于不同类型的请求。

状态码 状态消息 含义  
200 OK 服务器成功处理了请求(这个是我们见到最多的)  
201 Created(已创建) 对于那些要服务器创建对象的请求来说,资源已创建完毕。  
202 Accepted(已接受) 请求已接受, 但服务器尚未处理  
203 Non-Authoritative Information(非权威信息) 服务器已将事务成功处理,只是实体Header包含的信息不是来自原始服务器,而是来自资源的副本。  
204 No Content(没有内容) Response中包含一些Header和一个状态行, 但不包括实体的主题内容(没有response body)  
205 Reset Content(重置内容)  另一个主要用于浏览器的代码。意思是浏览器应该重置当前页面上所有的HTML表单。  
206 Partial Content(部分内容)  部分请求成功  

状态码:204(no  content,没有内容):返回的响应中,只有一些header和一个状态行,没有实体的主题内容(没有响应body)。

作用如下:

                  (1)在不获取资源的情况下,了解资源的情况(比如判断其类型)

                  (2)通过查看http响应中的状态码,查看某个对象是否存在。

                  (3)通过查看header测试资源是否被修改。

实例:先打开Fiddler, 然后启动浏览器访问ditu.google.cn,  你会捕获到很多204

状态码:206(partial  content):代表服务器已经成功处理了部分GET请求(只有发送GET 方法的request, web服务器才可能返回206)

应用场景:

1. FlashGet, 迅雷或者HTTP下载工具都是使用206状态码来实现断点续传

2. 将以个大文档分解为多个下载段同时下载 比如,在线看视频

实例: 一些流媒体技术比如在线视频,可以边看边下载。 就是使用206来实现的。

打开Fiddler, 然后用浏览器打开“搜狐视频中的绿箭侠” http://tv.sohu.com/20121011/n354681393.shtml    然后你在Fiddler中就能看到一堆的206

1. 浏览器发送一个Get 方法的request.  header中包含 Range: bytes=5303296-5336063. (意思就是请求得到5303296-5336063这个范围的数据)。

2. Web服务器返回一个206 的Response. header中包含Content-Range: bytes 5303296-5336063/12129376(表明这次返回的内容范围)

3XX 重定向状态码

重定向状态码用来告诉浏览器客户端,它们访问的资源已被移动, Web服务器发送一个重定向状态码和一个可选的Location Header, 告诉客户端新的资源地址在哪。

浏览器客户端会自动用Location中提供的地址,重新发送新的Request。 这个过程对用户来说是透明的。

301和302 非常相似,  一个是永久转移,一个是临时转移。  

(SEO中,搜索引擎如果碰到301, 比如网页A用301重定向到网页B,搜索引擎可以肯定网页A永久性改变地址,就会把网页B当做唯一有效目标)

302,303,307 是一样。  这是因为302是HTTP 1.0定义的, HTTP1.1中使用303,307. 同时又保留了302.  (但在现实中,我们还是用302,我是没见过303和307)

所以这一节, 我们只需要掌握302, 304 就可以了。

状态码 状态消息 含义  
300 Multiple Choices(多项选择)  客户端请求了实际指向多个资源的URL。这个代码是和一个选项列表一起返回的,然后用户就可以选择他希望的选项了  
301 Moved Permanently(永久移除) 请求的URL已移走。Response中应该包含一个Location URL, 说明资源现在所处的位置  
302 Found(已找到) 与状态码301类似。但这里的移除是临时的。 客户端会使用Location中给出的URL,重新发送新的HTTP request  
303  See Other(参见其他) 类似302  
304 Not Modified(未修改) 客户的缓存资源是最新的, 要客户端使用缓存  
305  Use Proxy(使用代理) 必须通过代理访问资源, 代理的地址在Response 的Location中  
306  未使用  这个状态码当前没使用  
307 Temporary Redirect(临时重定向 类似302  


状态码:301(moved  permanently):表示网页已经永久性的转移到另外一个地址。

请求的URL已移走。Response中应该包含一个Location URL, 说明资源现在所处的位置

例如:  1.  浏览器客户端访问 http://map.google.cn

2. Web服务器返回Response 301,Location=http://titu.google.cn  (告诉客户端我们的资源位于这里, )

3. 浏览器客户端会自动再发送一个Request 去访问http://titu.google.cn

 

状态码:302(found):当我们访问一个url的时候,服务器要我们访问另外一个资源,这个时候浏览器会继续发一个http,请求访问新的资源。

重定向,新的URL会在response 中的Location中返回,浏览器将会自动使用新的URL发出新的Request

例如在IE中输入, http://www.google.com. HTTP服务器会返回302, IE取到Response中Location header的新URL, 又重新发送了一个Request.

301和302在语法上是一模一样的,都是在location中返回新的url。区别在于:

(1)、301表示旧地址的资源已经被永久的移除了(这个资源不可访问了),
搜索引擎会把权重算到新的地址; (
2)、302表示旧地址的资源还在(仍然可以访问),这个重定向只是临时的从旧地址跳转到新地址,
搜索引擎会把权重算到旧的地址;

状态码:304 (Not Modified):代表上次的文档已经被缓存了, 还可以继续使用

例如打开博客园首页, 发现很多Response 的status code 都是304

提示: 如果你不想使用本地缓存可以用Ctrl+F5 强制刷新页面

4XX客户端错误状态码

有时客户端会发送一些服务器无法处理的东西,比如格式错误的Request, 或者最常见的是, 请求一个不存在的URL。

状态码 状态消息 含义  
400 Bad Request(坏请求) 告诉客户端,它发送了一个错误的请求。  
401 Unauthorized(未授权) 需要客户端对自己认证  
402 Payment Required(要求付款) 这个状态还没被使用, 保留给将来用  
403 Forbidden(禁止) 请求被服务器拒绝了  
404 Not Found(未找到) 未找到资源  
405 Method Not Allowed(不允许使用的方法) 不支持该Request的方法。  
406 Not Acceptable(无法接受)    
407 Proxy Authentication Required(要求进行代理认证) 与状态码401类似, 用于需要进行认证的代理服务器  
408 Request Timeout(请求超时)  如果客户端完成请求时花费的时间太长, 服务器可以回送这个状态码并关闭连接  
409 Conflict(冲突) 发出的请求在资源上造成了一些冲突  
410 Gone(消失了) 服务器曾经有这个资源,现在没有了, 与状态码404类似  
411 Length Required(要求长度指示) 服务器要求在Request中包含Content-Length。  
412 Precondition Failed(先决条件失败)    
413 Request Entity Too Large(请求实体太大) 客户端发送的实体主体部分比服务器能够或者希望处理的要大  
414 Request URI Too Long(请求URI太长) 客户端发送的请求所携带的URL超过了服务器能够或者希望处理的长度  
415 Unsupported Media Type(不支持的媒体类型) 服务器无法理解或不支持客户端所发送的实体的内容类型  
416 Requested Range Not Satisfiable(所请求的范围未得到满足)    
417 Expectation Failed(无法满足期望)  

400 Bad Request(坏请求)

发送的Request中的数据有错误(比如:表单有错误,Cookie有错误),  这个我们也经常见到。

401(unauthorized)(未授权错误)

有些网页采用的是http基本认证(basic  authentication),所以需要在http请求中带上authorization  header,否则服务器会返回状态码401

403 Forbidden(禁止)

Web客户端发送的请求被Web服务器拒绝了, 如果服务器想说明为什么拒绝请求,可以包含实体的主体部分来对原因进行描述。但这个状态码通常是服务器不想说明拒绝原因。

访问下面的URL, 会被服务器拒绝. 并且返回403状态码

http://t2.baidu.com/it/u=1791561788,200960144&fm=0&gp=0.jpg

404 Page not Found (请求的资源不存在)

这个大家都懂的, 值得一提的是: 腾讯把404页面做成了“寻找被拐儿童”

 

 

 

 

405 Method Not Allowed(不允许使用的方法)

405是指Web服务器不支持Request中的方法。

我个人认为状态码405Method Not Allowed和501 Not Implemented 是一样的意思。都是不支持Request的方法。 (目前我还不知道这两个的区别)

实例:  发送一个是trace方法的Request 给www.google.com

 

 

 

 

411 Length Required(要求长度指示)

服务器要求在Request中包含Content-Length。

当浏览器使用Post方法,发送数据给Web服务器时, 必须要有Content-Length。这样Web服务器才知道你要发送多少数据,否则Web服务器会返回411状态码

实例: 发送一个Post方法的Request 给www.google.com.   Request中没有Content-Length

 

 

 

 

 

413 Request Entity Too Large(请求实体太大)

作用:客户端发送的实体主体部分比服务器能够或者希望处理的要大。  一般情况下我们看不到这个状态码。 因为浏览器不会发送太大的数据给网站,但是机器人可能会。

实例: 用post方法发送一个大文件(100MB以上)给www.google.com

 

 

 

 

414 Request URI Too Long(请求URI太长)

就是说Request URI太长, 一般浏览器本身对URI的长度就会有限制,所以不会发送URI很长的Request. 我们平常是根本看不到414错误的。 但是机器人可以发送很长URI。

例如:我们用Fiddler Composer发送一个很长的URI给Google, 比如 "www.google.com?q=asdfasdasf.."  q=后面的参数很长。 就可以看到414了

5XX服务器错误状态码

有时候客户端发送了一条有效Request, Web服务器自身却出错了。 可能是Web服务器运行出错了, 或者网站都挂了。  5XX就是用来描述服务器错误的。

状态码 状态消息 含义  
500 Internal Server Error(内部服务器错误) 服务器遇到一个错误,使其无法为请求提供服务  
501 Not Implemented(未实现) 客户端发起的请求超出服务器的能力范围(比如,使用了服务器不支持的请求方法)时,使用此状态码。  
502 Bad Gateway(网关故障) 代理使用的服务器遇到了上游的无效响应  
503 Service Unavailable(未提供此服务) 服务器目前无法为请求提供服务,但过一段时间就可以恢复服务  
504 Gateway Timeout(网关超时) 与状态吗408类似, 但是响应来自网关或代理,此网关或代理在等待另一台服务器的响应时出现了超时  
505 HTTP Version Not Supported(不支持的HTTP版本) 服务器收到的请求使用了它不支持的HTTP协议版本。 有些服务器不支持HTTP早期的HTTP协议版本,也不支持太高的协议版本  

500 Internal Server Error(内部服务器错误)

这个太常见了, 我们开发网站的时候,当我们的程序出错了时,就会返回500错误。

实例:ASP.NET 程序出错

 

 

 

 

501 Not Implemented(未实现)

客户端发起的请求超出服务器的能力范围(比如,使用了服务器不支持的请求方法)时,使用此状态码)。  一般的Web服务器只支持GET和POST方法。

实例: 使用Fiddler Composer 给www.qq.com,  发送一个OPTIONS 方法的Request.   服务器就能返回501了。

 

 

 

 

 

502 Bad Gateway(网关故障)

代理使用的服务器遇到了上游的无效响应。  

Fiddler本身就是代理服务器。  当我们访问www.facebook.com,这网站被我们天朝屏蔽了。 所以我们可以得到502

 

503(server  unavailable)(服务器暂时不可用)

由于服务器维护或者过载,服务器当前无法处理请求;这个状况是临时的,并且将在一段时间以后恢复。

505 HTTP Version Not Supported(不支持的HTTP版本)

表示Web服务器不支持此HTTP协议的版本。  

众所周知我们现在使用的HTTP协议版本是HTTP/1.1, 如果我们发送一个HTTP/2.0 的request 给博客园, 博客园肯定不能支持HTTP/2.0,所以会返回505 

想要发送这样的request, 可以使用Fiddler工具中的Composer来发送自定义的request, 如下图。

猜你喜欢

转载自www.cnblogs.com/xiaobaibailongma/p/12115820.html