HTTP协议之⽅法定义
⽅法定义(Method Definitions)
1 安全和等幂(Idempotent)⽅法
1.1 安全⽅法(Safe Methods)
安全⽅法通常是指不影响服务器端资源的⾏为,它的操作结果仅仅是读取信息。
GET和HEAD⽅法只是执⾏对服务器没有影响的获取资源动作。这些⽅法应该被考虑是“安全”的。可以让⽤户代理调⽤的其它⽅法,如:POST、PUT、DELETE,这些⽅法是特殊的,⽤户代理应该知道这些⽅法可能会执⾏不安全的动作。
⾃然的,保证服务器由于执⾏GET请求⽽不能产⽣副作⽤是不可能的。实际上,⼀些动态的资源会考虑这个特性。⽤户并没有请求这些副作⽤,因此这些副作⽤对⽤户应该是不受影响的。
1.2 等幂⽅法(Idempotent Mehtods)
等幂就是值不变性,相同的请求得到相同的响应结果,不会出现相同的请求返回不同的响应结果。⽅
法GET、HEAD、PUT、DELETE都有这种性质。同样,⽅法OPTIONS和TRACE不应该有副作⽤,因此具有内在的等幂性。迪斯科皇后
2 OPTIONS(选项)
OPTIONS⽅法表明请求想得到请求或者响应链上关于此请求⾥的URI(Request-URI)指定资源的通信选项信息。此⽅法允许客户端去判定请求资源的选项,或者服务器的能⼒,⽽不需要利⽤⼀个资源动作(使⽤POST,PUT,DELETE⽅法)或⼀个资源获取⽅法。
此⽅法的响应是不能缓存的。
如果OPTIONS请求消息⾥包括⼀个实体主体(当请求消息⾥出现Content-Length或者Transfer-Encoding头域时),那么媒体类型必须通过Content-Type头域指明。虽然此规范没有定义如何使⽤此实体主体,将来的HTTP扩展可能会利
⽤OPTIONS请求的消息主体去得到服务器得更多信息。⼀个服务器如果不⽀持OPTION请求的消息主体,它会遗弃此请求消息主体。
如果请求URI是⼀个星号("*"),OPTIONS请求将会应⽤于服务器的所有资源⽽不是特定资源。因为服务器的通信选项通常依赖于资源,所以“*”请求只能在“ping”或者“no-op”⽅法时才有⽤;它⼲不了任
何事情除了允许客户端测试服务器的能⼒。例如:它能被⽤来测试代理是否遵循HTTP/1.1。
如果请求URI不是⼀个星号("*"),OPTIONS请求只能应⽤于请求URI指定资源的选项。
200响应应该包含任何指明选项性质的头域,这些选项性质由服务器实现并且只适合那个请求的资源(例如,Allow头域),但也可能包⼀些扩展的在此规范⾥没有定义的头域。如果有响应主体的话也应该包含⼀些通信选项的信息。这个响应主体的格式并没有在此规范⾥定义,但是可能会在以后的HTTP⾥定义。内容协商可能被⽤于选择合适的响应格式。如果没有响应主体包含,响应就应该包含⼀个值为“0”的Content-Length头域。
Max-Forwards请求头域可能会被⽤于针对请求链中特定的代理。当代理接收到⼀个OPTIONS请求,且此请求
拉丁文
的URI为absoluteURI,并且此请求是可以被转发的,那么代理必须要检测Max-Forwards头域。如果Max-Forwards头域的值为“0”,那么此代理不能转发此消息;⽽是代理应该以它⾃⼰的通信选项响应。如果Max-Forwards头域是⽐0⼤的整数值,那么代理必须递减此值当它转发此请求时。如果没有Max-Forwards头域出现在请求⾥,那么代理转发此请求时不能包含Max-Forwards头域。
3 GET
越狱重启版
GET⽅法意思是获取被请求URI(Request-URI)指定的信息(以实体的格式)。如果请求URI涉及到⼀个数据⽣成过程,那么这个过程⽣成的数据应该被作为实体在响应中返回⽽不是过程的源⽂本,除⾮源⽂本恰好是过程的输出。
如果请求消息包含 If-Modified-Since,,If-Unmodified-Since,If-Match,If-None-Match或者 If-Range头域,GET的语义将变成“条件(conditionall) GET”。⼀个条件GET⽅法会请求满⾜条件头域的实体。条件GET⽅法的⽬的是为了减少不必要的⽹络使⽤,这通过允许利⽤缓存⾥仍然保鲜的实体⽽不⽤多次请求或传输客户端已经拥有的实体来实现的。
underdog如果请求⽅法包含⼀个Range头域,那么GET⽅法就变成“部分Get”(partial GET)⽅法。⼀个部分GET会请求实体的⼀部分。部分GET⽅法的⽬的是为了减少不必要的⽹络使⽤,可以允许客户端从服务器获取实体的部分数据,⽽不需要获取客户端本地已经拥有的部分实体数据。
GET请求的响应是可缓存的(cacheable)如果此响应满⾜HTTP缓存的要求。
4 HEAD
HEAD⽅法和GET⽅法⼀致,除了服务器不能在响应⾥返回消息主体。HEAD请求响应⾥HTTP头域⾥的元信息(元信息就是头域信息)应该和GET请求响应⾥的元信息⼀致。此⽅法被⽤来获取请求实体
的元信息⽽不需要传输实体主体(entity-body)。此⽅法经常被⽤来测试超⽂本链接的有效性,可访问性,和最近的改变。
HEAD请求的响应是可缓存的,因为响应⾥的信息可能被缓存⽤于更新以前那个资源对应缓存的实体.。如果出现⼀个新的域值指明缓存的实体和当前源服务器上的实体有所不同(可能因为Content-Length,Content-MD5,ETag或Last-Modified值的改变),那么缓存(cache)必须认为缓存项是过时的(stale)。
5 POST
POST ⽅法被⽤于请求源服务器接受请求中的实体作为请求资源的⼀个新的从属物。POST被设计涵盖下⾯的功能。
已存在的资源的注释。
发布消息给⼀个布告板,新闻组,邮件列表,或者相似的⽂章组。
account是什么意思提供⼀个数据块,如提交⼀个表单给⼀个数据处理过程。
通过追加操作来扩展数据库。
POST⽅法的实际功能是由服务器决定的,并且经常依赖于请求URI(Request-URI)。POST提交的实体是请求URI的从属物,就好像⼀个⽂件从属于⼀个⽬录,⼀篇新闻⽂章从属于⼀个新闻组,或者⼀条记录从属于⼀个数据库。
haltPOST⽅法执⾏的动作可能不会对请求URI所指的资源起作⽤。在这种情况下,200(成功)或者204(没有内容)将是适合的响应状态,这依赖于响应是否包含⼀个描述结果的实体。
如果资源被源服务器创建,响应应该是201(Created)并且包含⼀个实体,此实体描述了请求的状态。并且引⽤了这个新资源和⼀个Location头域。
新年英文祝福语POST⽅法的响应是不可缓存的。除⾮响应⾥有合适的Cache-Control或者Expires头域。然⽽,303(见其他)响应能被⽤户代理利⽤去获得可缓存的响应。
6 PUT
PUT⽅法请求服务器去把请求⾥的实体存储在请求URI(Request-URI)标识下⾯。请求URI(Request-URI)指定的的资源已经在源服务器上存在,那么此请求⾥的实体应该被当作是源服务器关于此URI所指定资源实体的最新修改版本。如果请求URI(Request-URI)指定的资源不存在,并且此URI被⽤户代理定义为⼀个新资源,那么源服务器就应该根据请求⾥的实体创建⼀个此URI所标识下
的资源。如果⼀个新的资源被创建了,源服务器必须能向⽤户代理(ur agent) 发送201(已创建)响应。如果已存在的资源被改变了,那么源服务器应该发送200(Ok)或者204(⽆内容)响应。如果资源不能根据请求URI创建或者改变,⼀个合适的错误响应应该给出以反应问题的性质。实体的接收者不能忽略任何它不理解和不能实现的Content-
*(如:Content-Range)头域,并且必须返回501(没有被实现)响应。
如果请求穿过⼀个缓存(cache),并且此请求URI(Request-URI)指⽰了⼀个或多个当前缓存的实体,那么这些实体应该被看作是旧的。PUT⽅法的响应是不可缓存的。
thunderbirdsPOST⽅法和PUT⽅法请求最根本的区别是请求URI(Request-URI)的含义不同。POST请求⾥的URI指⽰⼀个能处理请求实体的资源(此资源可能是⼀段程序,如jsp⾥的rvlet)。此资源可能是⼀个数据接收过程,⼀个⽹关(gateway,⽹关和代理的区别是:⽹关可以进⾏协议转换,⽽代理不能,只是起代理的作⽤,⽐如缓存服务器其实就是⼀个代理),或者⼀个单独接收注释的实体。对⽐⽽⾔,PUT⽅法请求⾥的URI标识请求⾥封装的实体⼀⼀⽤户代理知道URI意指什么,并且服务器不能把此请求应⽤于其它资源(resource)。如果服务器期望请求被应⽤于⼀个不同的URI,那么它必须发送301(永久移动)响应;⽤户代理可以⾃⼰决定是否重定向请求。
⼀个单独的资源可能会被许多不同的URI指定。如:⼀篇⽂章可能会有⼀个URI指定当前版本,⽽这
mink
个URI区别于这篇⽂章其它特殊版本的URI。这种情况下,对⼀个通⽤URI的PUT请求可能会导致其资源的其
它URI请求被源服务器重定义。
HTTP/1.1没有定义PUT⽅法对源服务器的状态影响。
PUT请求必须遵循消息传送的要求。
除⾮特别指出,PUT⽅法请求⾥的实体头域应该被⽤于资源的创建或修改。
7 DELETE
DELETE⽅法请求源服务器删除请求URI指定的资源。此⽅法可能会在源服务器上被⼈为的⼲涉(或通过其他⽅法)。客户端不能保证此操作能被执⾏,即使源服务器返回成功状态码。然⽽,服务器不应该指明成功除⾮它打算删除资源或把此资源移到⼀个不可访问的位置。
如果响应⾥包含描述成功的实体,响应应该是200(OK);如果DELETE动作还没有执⾏,应该以202(已接受)响应;如果DELETE请求⽅法已经执⾏但响应不包含实体,那么应该以204(⽆内容)响应。
变形金刚4票房
如果请求穿过缓存,并且请求URI(Request-URI)指定了⼀个或多个缓存当前实体,那么这些缓存项应该被认为是旧的。DELETE⽅法的响应是不能被缓存的。
8 TRACE
TRACE⽅法被⽤于激发⼀个远程的,应⽤层的请求消息回路(TRACE⽅法让客户端测试到服务器的⽹络通路,回路的意思如发送⼀个请返回⼀个响应,这就是⼀个请求响应回路)。最后的接收者也许是源服务器,也许是接收到包含Max-Forwards头域值为0请求的代理或⽹关。TRACE请求不能包含⼀个实体。
TRACE⽅法允许客户端去了解数据被请求链的另⼀端接收的情况,并且利⽤那些数据信息去测试或诊断。Via头域值有特殊的⽤途,因为它可以作为请求链的跟踪信息。利⽤Max-Forwards头域允许客户端限制请求链的长度,这是⾮常有⽤的,因为可以利⽤此去测试代理链在⽆限循环⾥转发消息。
如果请求是有效的,响应应该在实体主体⾥包含整个请求消息,并且响应应该包含⼀个Content-Type头域值
为”message/http”的头域。此⽅法的响应不能被缓存。
9 CONNECT
HTTP1.1协议规范保留了CONNECT⽅法,此⽅法是为了能⽤于能动态切换到隧道的代理。