URI和URL的区别
区别:URI可以表示一个域,也可以表示一个资源。URL只能表示一个资源
关联:URL是URI的一个子集
[ftp://ftp.is.co.za/rfc/rfc1808.txt](https://link.jianshu.com?t=ftp://ftp.is.co.za/rfc/rfc1808.txt) (also a URL because of the protocol)
[http://www.ietf.org/rfc/rfc2396.txt](https://link.jianshu.com?t=http://www.ietf.org/rfc/rfc2396.txt) (also a URL because of the protocol)
ldap://[2001:db8::7]/c=GB?objectClass?one (also a URL because of the protocol)
[mailto:John.Doe@example.com](https://link.jianshu.com?t=mailto:John.Doe@example.com) (also a URL because of the protocol)
[news:comp.infosystems.www.servers.unix](https://link.jianshu.com?t=news:comp.infosystems.www.servers.unix) (also a URL because of the protocol)
tel:+1-816-555-1212
telnet://192.0.2.16:80/ (also a URL because of the protocol)
urn:oasis:names:specification:docbook:dtd:xml:4.1.2
HTTPS的证书签发
HTTPS = HTTP + 加密 + 认证 + 完整性保护
GET请求里的body问题
-
A payload within a GET request message has no defined semantics; sending a payload body on a GET request might cause some existing implementations to reject the request.【GET请求消息中的有效负载没有定义语义,在GET请求上发送有效负载体可能会导致某些现有实现拒绝该请求】
意思是你往GET请求里加body是不符合规范的,不保证所有的实现都支持(主要是以前的实现,因为以前曾经有相应的规定),要是出了啥问题别怪我没提醒你。而且据说老版本的postman是不支持在GET请求里加body的,也是最近才加上的支持;所以要放在以前也就没这些问题了,以前的postman根本发不了带body的GET请求。
-
A server SHOULD read and forward a message-body on any request; if the request method does not include defined semantics for an entity-body, then the message-body SHOULD be ignored when handling the request
GET请求不应携带请求体,服务器应忽略(或者说丢弃)GET请求的请求体
3.GET 被设计来用 URI 来识别资源,如果让它的请求体中携带数据,那么通常的缓存服务便失效了,URI 不能作为缓存的 Key【这个缓存,大概是指那种预加载和后存储,会涉及到一个网络请求的“安全性”。如果不安全,显然是不能缓存的】
总结:
GET请求通过请求体提交参数,POST请求通过url提交参数,在技术上是完全行的通的。 在网络世界中,将TCP比作汽车,我们用TCP来运输数据,它很可靠,从来不会发生丢件少件的现象。但是如果路上跑的全是看起来一模一样的汽车,那这个世界看起来是一团混乱,送急件的汽车可能被前面满载货物的汽车拦堵在路上,整个交通系统一定会瘫痪。为了避免这种情况发生,交通规则HTTP诞生了。HTTP给汽车运输设定了好几个服务类别,有GET、 POST、 PUT、DELETE等等,HTTP规定当执行GET请求的时候,要给汽车贴上GET的标签(设置method为GET),而且要求把传送的数据放在车顶上(url中)以方便记录。如果是POST请求,就要在车上贴上POST的标签,并把货物放在车厢里(请求体中)。当然,你也可以在GET的时候往车厢内偷偷藏点货物,但是这是很不光彩;也可以在POST的时候在车顶上也放一些数据,让人觉得傻乎乎的。HTTP只是个行为准则,而TCP才是GET和POST怎么实现的基本。
对于GET请求参数的大小限制,我们知道是由于url长度的限制导致的,但其实url的长度并不是GET请求限制的,而是特定的浏览器及服务器的限制,将不同的浏览器和服务器比作不同的运输公司,虽然理论上可以在车顶上无限地堆货物(url中无限加参数),但是运输公司可不傻,装货和卸货也是有很大成本的,他们会限制单次运输量来控制风险,数据量太大对浏览器和服务器都是很大负担。业界不成文的规定是,(大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url,超过的部分恕不处理。因此使用POST请求通过url传递参数并不能保证参数一定能被接收到。同理,如果你用GET请求,在请求体中偷偷藏了数据,不同服务器的处理方式也是不同的,有些服务器会帮你卸货,读出数据,有些服务器直接忽略,所以,虽然GET请求可以使用请求体提交参数,也不能保证参数一定能被接收到。
总结一下可以得出结论,GET请求和POST请求本质上是一样的,GET请求通过请求体提交参数和POST请求通过url提交参数都是可行的,但是并不推荐这样做,因为并不能保证服务器可以接受到这种方式传递的参数。