• 一步
    2019-06-19
    OPTIONS 方法还是用的很多的,CORS跨域请求必须用到OPTIONS方法了

    作者回复: 我接触的领域里options用的比较少,可能有点孤陋寡闻了。

     3
     9
  • 壹笙☞漂泊
    2019-06-19
    答题:
    1、增:POST 删:DELETE 改:PUT 查:GET
    请求头如何设计,这个问题。。。不太明白。
    2、我认为可以,因为http协议具有很好的灵活性。具体的对资源操作是由服务器决定的。

    总结:
    Http/1.1规定了八种方法,单词必须都是大写的形式。
        1. GET:获取资源,可以理解为读取或者下载数据
        2. HEAD:获取资源的元信息;
        3. POST:向资源提交数据,相当于写入或上传数据;
        4. PUT:类似POST;
        5. DELETE:删除资源;
        6. CONNECT:建立特殊的连接隧道;
        7. OPTIONS:列出可对资源实行的方法;
        8. TRACE:追踪请求-响应的传输路径。

    GET/HEAD
        ——从服务器获取资源
        HEAD和GET类似,也是从服务器获取资源,但是不会返回请求的实体数据,只有响应头(元信息),是GET的简易版,如果不需要资源的话,可以避免传输body数据的浪费。

    POST/PUT
        ——向服务器提交数据,数据在body里
        PUT和POST作用类似,有微妙不同,通常POST标识新建,PUT标识修改

    DELETE
        ——删除资源,危险性大,很少用

    CONNECT
        ——要求服务器为客户端和另一台远程服务器建立一条特殊的链接,这时Web服务器充当代理的角色

    OPTIONS
        ——要求服务器列出可对资源实行的操作方法,在响应头Allow字段里返回。功能有限,用处不大。Nginx没支持

    TRACE
        ——用于对HTTP链路的测试或诊断,可以显示出请求 - 响应的传输路径。存在漏洞,会泄露网站的信息,所以通常也是禁止使用

    安全与幂等
        安全:在HTTP协议里,所谓的安全,是指请求方法不会对服务器上的资源造成实质的修改,so 只有GET和HEAD是安全的,因为是只读操作。
        幂等:多次执行相同的操作,结果也都是相同的。so GET和HEAD 即是安全的也是幂等的,DELETE可以多次删除同一个资源,效果都是“资源不存在”,所以也是幂等。POST是新增或提交数据,多次提交会创建多个资源,所以不是幂等的。PUT是替换或更新数据,多次更新一个资源,资源还是第一次更新的状态。所以是幂等的。
        幂等:GET、HEAD、DELETE、PUT
        非幂等:POST

    展开

    作者回复: 总结的非常好。
    问题里的“请求头如何设计”,意思是说相关的curd参数应该放在什么地方,比如用query参数或者是字段,只是一个提示,不是要必须如何如何做。

     1
     7
  • 趙衍
    2019-06-19
    关于Post和Get之间的区别,我一直很困惑,因为其实我们也可以在Get的请求体里写参数,用Get去修改资源;或者在Post的请求头上去写参数,用它去获取资源。所以他们两者之间到底有什么区别呢?希望老师可以指教一下!

    作者回复: 就是个使用的习惯和约定,就像是红绿灯,不是强制要求你必须遵守,但大家都按照这样做沟通起来顺畅。

    要理解协议的含义,要求你遵守,但不强制。

    
     4
  • 业余爱好者
    2019-06-19
    之前做一个网站的cms,觉得又是一套crud,毫无新意,闲得慌,于是玩了一波restful"架构"。严格按照http规范,比如,查询都用GET,新增用POST,更新用PUT,删除用DELETE,url的设计也按照rest风格设计。现在想想,tomcat支持这几种http方法也是万幸,不然的话,又得加班换成get/post了。

    这段经历我认识到,http只是一种协议,不同的服务器,还有客户端,比如浏览器都可以有自己的实现。虽然各自在实现上有所取舍,但大体上,按照协议规范来,不会差。

    协议,是个好东西。。
    展开

    作者回复: 请求方法的设计思想非常好,动词可以表示各种操作,所以非常适合RESTful。

    
     3
  • 彧豪
    2019-07-23
    老师,关于options请求,我有一些疑问,就是这个请求似乎是不受前端开发和服务端开发控制的是不是?get,post或者delete之前都有可能发出,那它的出现时机或机理是怎样的呢,为何会发出options请求?我发现我平时用webpack的代理来开发,代理到测试/生产环境的时候,get/post/delete请求之前没有options请求,但是部署到测试环境或者生产环境之后就会在get/post/delete请求之前会发出一个options请求,然后我司的其他前端和java工程师都说不上个所以然来,我也不懂,所以想要问下老师看看,希望老师能指点迷津

    作者回复: options请求会在allow字段里列出可以对资源实施的操作方法,比如有的资源只支持get,有的只支持post/delete。

    所以有的时候回先发一个options,来确定应该如何操作资源。

    不过这个方法用的很少,其实没太大用处,因为即使资源不支持某种方法,直接返回一个405或者其他的状态码就可以了。

     1
     2
  • 1900
    2019-06-19
    “幂等”有什么具体的落地场景么?它重要的原因在哪里呢?

    作者回复: 在RESTful设计的时候,要考虑动作对服务器内部状态的影响。

    这个比较理论,一般不太需要关心。

     2
     2
  • 大小兵
    2019-06-19
    真希望快点更新啊,看的不过瘾!

    作者回复: 慢慢来。

    
     2
  • 浩浩
    2019-06-19
    老师有个问题想问一下,我之前用比较旧的http工具类发请求,使用get方法时不能使用请求体,但使用软件工具能使用请求体,不同方法对请求的格式要求是不是一样,还有就是不同方法的区别是不是体现在服务器的响应上,用post请求访问一张照片会是什么样的,暂时还没试过

    作者回复: 任何请求报文都可以带请求体,与方法无关,老的工具可能对协议支持的不好。

    后面你理解的对,请求方法最终如何处理还是要依赖于服务器,如果愿意,服务器也可以用get来上传数据,用post获取数据,现在的get/post都是依据协议标准来执行,所以是get获取post上传。

    
     2
  • Geek_steven_wang
    2019-08-13
    既然不同服务器支持的方法不同,是不是最好把不支持的方法在服务器侧明确返回404 或503。这样更安全。
    关于幂等,其实是协议规定了get delete put 为幂等,服务器开发时要尽量实现为幂等,其实是对服务器实现的一个要求,当然开发人员可以不实现。

    作者回复: 是的,你理解的很对。

    协议就是一个要求通信双方都遵守的约定,当然也可以不遵守。

    
     1
  • 温木
    2019-08-06
    学到新的知识点,幂等,很不错,老师辛苦了

    作者回复: 不客气。

    
     1
  • 一步
    2019-06-19
    老师 WebDav 这一块会详细讲嘛? 有这块的需求,或者有没有好的文档

    作者回复: 这块我基本没用过,它也不是http标准里面的,抱歉了。

    
     1
  • 10
    2019-06-19
    我采用POST /10-2 HTTP/1.1的指令写了10-2的内容为“POST DATA IS HERE”,然后我采用GET /10-2 HTTP/1.1的指令去读内容 返回的“200 OK”,但实体body的内容只是一个“0”,而非前面写的“POST DATA IS HERE”
    请问难道我前面的POST指令没有写成功么?

    作者回复: 测试用的URI“10-2”不支持存储数据,所以post的数据只能在当次请求生效。

    另外发现这两测试uri有小bug,已经修复,请及时git pull更新。

    
     1
  • 许童童
    2019-06-19
    请求头里面应该要包含 请求的目标
    也就是对应数据库里面行
    
     1
  • 彧豪
    2019-06-19
    老师,话说我昨天实际项目终于到一个问题:
    get请求带上查询字符串例如?name=a+b,但是打开chrome的控制台network选项卡发现请求url那是对的,是xxx?name=a+b,但是最后的查询字符串那那里是name: a b,+号变成了空格,java那边收到的也是a b……
    最后的解决方法是我这边encodeURIComponent一下,java那边URLDecoder.decode一下即可
    但是我不明白为何会如此,为何get请求的查询字符串中带+号,浏览器会将其变为空格
    在浏览器控制台network选项卡底端的query string parameters那有个"view URL encoded"按钮,点了之后name:a b变为name:a+b,这就意味着空格被转义成了+号,那是不是这个a和b之间的字符(串)实际不是空格呢?毕竟我暂时想不到什么方法能将空格转义为+号
    关于+号变空格的问题希望老师能指点迷津,感谢
    展开

    作者回复: 下一讲里面的url编码就会谈到。
    uri里面有些字符是不允许出现的,需要编码和解码,而+正好就被解码成了空格。

    你刚才也说了,会用到encodeURI这样的函数。

    
     1
  • 汤小高
    2019-06-19
    老师,请问:幂等性指多次执行相同的操作,获取的结果是相同的。但是,比如get获取某个服务器资源,某个时刻获取的资源和下一时刻获取的资源也可能不一样吧,比如下一时刻服务器对该资源进行了改变,再get时,客户端获取的不就不一样了吗?

    作者回复: 幂等是指客户端操作对服务器的状态没有产生改变,虽然报文内容变了,但服务器还是没有变化。

    可以再对比一下delete和post。

    
     1
  • -W.LI-
    2019-06-19
    老师好!我项目用得nginx好像支持options请求,put请求幂等这个是不是有待商榷啊

    作者回复: 我看Nginx源码,是不支持options的。

    put的幂等是RFC定义的,当然你要实现出非幂等的功能也是可以的。

    
     1
  • Hills录
    2020-02-01
    课后1:GET /db/table?id=1 DB/0.9

    作者回复: 前面的对,后面的不对,请求行后面必须是HTTP/1.1(或者其他版本号)

     1
    
  • GitHubGanKai
    2020-01-07
    老师,这是我第三次刷这个专栏了,面试的时候,有个问题,想请教您一下,还希望你能解答一下:请求行 + 头部信息 + 空白行 + body ,有被问到说空白行的意义,我一直以为就是纯粹来标识 headers 的结束,但是面试官说不止这个功能,我后面看了HTTP 权威指南 也没有找到,Stack Overflow 也没找到。。。希望老师可以跟我说一下。

    作者回复: 按照http协议,空白行就是为了分隔header和body,因为http是纯文本的协议。

    不知道面试官还能有什么新的解释,也许是故弄玄虚。

    遇到这样的人可以及时请教,不能让他话只说一半。

    
    
  • 蓝配鸡
    2019-12-30
    既然服务器有着决定权,有没有可能请求方法是HEAD,服务器相应一个带有body的response?

    作者回复: 当然可以了,只是这样不符合客户端的预期,但不按规矩出牌也拦不住,客户端只能“默默承受”。

    
    
  • Wr
    2019-12-26
    1. 增--post,删--delete,改--put,查--get
    2. 应该是可以的,但是接触较少,暂时没什么思绪


    另:老师,我telnet可以连接测试环境,web也能正常访问,但是进入telnet用open就访问不了,macfee的80端口打开,关闭防火墙都不行,还有什么想法吗?
    展开

    作者回复: 没有具体的现场环境,不好解决问题,我觉得可以换一个其他的环境,用虚拟机安装一个Windows或者linux。

    
    
我们在线,来聊聊吧