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=123456 。 POST方法是把提交的数据放在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 成功状态码
客户端发起请求时, 这些请求通常都是成功的。服务器有一组用来表示成功的状态码,分别对应于不同类型的请求。
。
状态码: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 就可以了。
状态码: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(坏请求)
发送的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(内部服务器错误)
这个太常见了, 我们开发网站的时候,当我们的程序出错了时,就会返回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, 如下图。