HTTP与常见操作符
GET和POST的区别
GET
1.GET是幂等操作,Get请求不会改变服务器端资源的状态,相同请求进行get,结果都是一样的。
幂等操作:表示的操作至多只会被处理一次,每次调用都将返回第一次调用时的处理结果,就是没有其他操作的时候,第一次请求的结果和第N次是一样的。
2.GET可以缓存,动作是读取,所以可以对get到的数据进行缓存,减少请求次数。
3.GET把参数拼接在url当中。由于浏览器对于url长度有限制,所以get可以传递的参数大小是相对有限的,而且因为是在浏览器url中传递参数,所以参数非常容易被获取到。因此GET请求的参数除了用代码控制之外,手动在URL中去输入拼接也可以。
Restful中get+资源:去定位一个具体资源
POST:
1.POST请求是不幂等的,RESTFUL 中POST请求,代表的是post to append,意思就是向服务端发起请求,提交数据之后,会改变服务端的资源的状态,增加一个数据,并且相同的数据POST两遍在服务器端会生成两个新的资源。
2.POST请求数据来自表单提交,数据被编码到HTTP请求的body里。(在chrome开发者工具中可以在HTTP请求的variable中看到)
3.POST请求不可以被缓存,因为其会改变服务端资源的状态
4.用POST提交一些私密数据的时候相对安全,但是对于关键信息还是需要另外加密。
从防止攻击的角度来说,POST和get都不够安全,因为HTTP本身是明文协议。每个HTTP请求和返回的每个byte都会在网络上明文传播,不管是url,header还是body。只是POST的参数相对来说不像get那么只管展示在url上。
PUT:在restful中的语义是替代资源,服务器端不存在就创建,存在就替代,PUT是幂等操作。
PATCH :只修改所需要的字段,不会修改整个资源的状态。PATCH不是幂等的。比如服务端资源中有记录版本的信息,PATCH会引起版本的变化,所以不一定是幂等操作。
DELETE:删除该资源,是幂等操作,删除了资源就不存在了,删除多少次都一样。
OPTION:HTTP预请求,请求查询服务器性能,返回http allow报头,展示了请求的资源所支持的http方法,与CORS相关CORS跨域
- 思考:能否用GET来替代POST?不能的话为什么?
个人理解:服务端和客户端交互的时候可以强行用get请求是实现一些修改服务端资源的方法。但是会存在很多问题。- get通过url传递参数,url长度限制会导致参数丢失,后台资源更新数据不准确。
- url传递参数都是字符串,一些复杂数据类型,比如对象数组等在转化成字符串时可能转换失败导致数据丢失。
- url中传递的参数非常容易被篡改,只需要手动更改url的内容就可以篡改传输的数据。
常用状态码
2XX:表示请求成功
200(OK):服务端成功执行了请求
201(Created):服务端成功创建了个新资源,响应报头:Location报头应包含指向新创建资源的规范URI。3XX:重定向
重定向:是客户端行为,客户端请求后,发现服务端响应的是重定向相关的状态码,就去获取响应中的Location访问这个资源的新URL,浏览器中的URL会变化,客户端至少发起了两次请求。
为什么会重定向:概括的说就是资源原来的URL因为种种原因不再使用了,所以对原有地址应该做重定向处理。
1)网站调整(如改变网页目录结构);
2)网页被移到一个新地址;
3)网页扩展名改变(如应用需要把.php改成.Html或.shtml)。
这种情况下,如果不做重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户得到一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也需要通过重定向让访问这些域名的用户自动跳转到主站点等。
转发:是服务端行为,客户端感受不到服务端的转发操作,只是发起了一次请求,转发的路径必须是同一个web容器下的URL。
重定向和转发
300(Multiple Choices):请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端。
301(Moved Permanently):请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。
302(Temporarily Moved、Found):资源只是临时被移动。客户端应继续使用原有URI
301和302重定向的区别:
使用302的场景:当web资源只是在一段时间内临时转移到一个新的位置的时候,使用302告诉客户端,暂时用这个新地址。
使用301的场景:
1)换域名了
2)规定了带www的域名为规范域名,在搜索引擎的搜索结果中出现了不带www的域名,而带www的域名却没有收录,这个时候可以用301重定向来告诉搜索引擎我们目标的域名是哪一个。
3)空间服务器不稳定,换空间的时候。
推荐使用301,尽量不使用302的原因:避免网址URL劫持
301跳转对它告诉查找引擎,这个地址弃用了,永远转向一个新地址,可以转移新域名的权重。所以老地址的搜索权重会被转移到新的域名上去。(与SEO相关)
302有可能存在内容已经重定向了,但是因为URL规范等原因,URL并没有跳转,所以有可能有些页面明明内容被访问了很多次,但是URL或域名在搜索引擎当中并没有被增加,就是URL被劫持了。这样很容易被搜索引擎误认为是利用多个域名指向同一网站,那么你的网站就会被封掉,罪名是“利用重复的内容来干扰Google搜索结果的网站排名”。
301和302比较
303(See Other):GET方法不会发生变更,其他方法会变更为 GET 方法(消息主体会丢失)。用于PUT请求方法 PUT或POST请求完成之后进行页面跳转来防止由于页面刷新导致的操作的重复触发。对于POST请求,它表示请求已经被处理,客户端可以接着使用GET方法去请求Location里的URI。
307(Temporary Redirect):类似于302,对于POST请求,表示请求还没有被处理,客户端应该向Location里的URI重新发起POST请求。
304(Not Modified):会使页面跳转到本地陈旧的缓存版本当中。
305(Use Proxy):必须通过代理访问资源, 代理的地址在Response 的Location中。
mozilla Redirections
- 4XX:客户端请求错误
400(Bad Request):客户端请求的语法错误,服务器无法理解
401(Unauthorized):请求要求用户的身份认证。客户端提供了错误的证书,或者根本没有提供证书。
响应报头:WWW-Authenticate报头描述服务器将接受哪种认证。
实体主体:一个错误的描述文档。
潜台词:要客户端重新发送正确的身份验证信息。(我不认识你,需要验证你身份)
403(Forbidden):对于请求的资源没有访问的权限,即使你已经通过身份验证了。
潜台词是:联系服务端管理员开通权限。(我认识你,但是你无权访问)
404(Not Found):没有找到对应资源。
405(Method Not Allowed):请求的方法不允许。比如URL只允许POST,不允许DELETE时,用DELETE去请求会报错。
406(Not Accepted):服务器无法响应请求中指定的请求头Accept
比如:请求头(Request Headers)中看到请求信息是json格式,响应头(Response Hraders)中却发现返回信息的格式是“text/html”,前台无法解析。
409(Conflict):服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突
- 5XX:服务端错误
500(Internal Server Error):服务端出错
501(Not Implemented):客户端试图使用一个服务器不支持的HTTP特性。最常见的例子是:客户端试图做一个采用了拓展HTTP方法的请求,而普通web服务器不支持此请求。它跟响应代码405比较相似,405表明客户端所用的方法是一个可识别的方法,但该资源不支持,而501表明服务器根本不能识别该方法。
502(Bad Gateway):表明代理方面出现问题,或者代理与上行服务器之间出现问题,而不是上行服务器本身有问题。若代理根本无法访问上行服务器,响应代码将是504。
503("Service Unavailable"):由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中。
504("Gateway Timeout"):跟502类似,只有HTTP代理会发送此响应代码。请求超时
505("HTTP Version Not Supported")