V2EX 首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  程序员

RESTful 有用吗? HTTP 有 GET POST 就足够了?

  •  
  •   noli · 159 天前 · 12200 次点击
    这是一个创建于 159 天前的主题,其中的信息可能已经有所发展或是发生改变。

    不少程序员都是这么认为的,基于 HTTP API 的服务,只要用 GET 请求和 POST 请求就足够了。 像 RESTful 这样的 大量使用 PUT , DELETE 请求是不必要的。

    真的吗,我来举一个例子。

    假设有一类资源 ResourceXYZ ,对其有增删查改的操作。 如果只使用 GET POST 之类的设计方式,那么很可能会设计以下的请求接口:

    POST .../addResourceXYZ
    POST .../delResourceXYZ
    GET .../getResourceXYZ?resourceId=resourceId
    POST .../updateResourceXYZ
    

    如果按照 RESTful 的 设计方式,很可能会设计以下的请求接口

    POST .../ResourceXYZs
    DELETE .../ResourceXYZ/{resourceId}
    GET .../ResourceXYZ/{resourceId}
    PUT .../ResourceXYZ/{resourceId}
    

    现在假设,客户端要获取该资源,其 ID 为 resourceId 。 如果成功,那么一切都好说。 如果失败, Restful 的处理方式是,通过 HTTP status 返回错误码来表示原因,例如 404 表示该资源不存在。

    那么只用 GET POST 两种方法的方式呢? 响应请求

    GET .../getResourceXYZ?resourceId=resourceId
    

    的时候能不能也用 404 呢?

    按照 404 的语义,响应 404 是不对的: 因为客户端请求的 URL 实际上是正确的,只是对应的参数没有找到对应的结果 很多时候,就只能靠响应 200 然后返回空数据或者空对象来处理了。 例如 Content-type 为 application/json 时,可以返回 {} 或者

    {
        "error": "not found",
        "code": 404
    }
    

    这样就会要求客户端,必须处理 HTTP 回复的具体内容,而不能只处理头部。 那么客户端要怎么处理这个 json 呢 要先解析 json ,然后尝试分别这是一个资源的内容,还是一个错误提示。

    对于强类型语言例如 C/C++ OC Swift 写的客户端来说,恐怕就忍不住要问候服务端程序员一家了。

    更重要的是……

    没有库会支持这种拍脑袋式的设计。

    全文完,欢迎拍砖。

    202 回复  |  直到 2017-04-21 20:18:18 +08:00
    1  2  3  
        201
    noli   96 天前
    @Balthild 只是你读的大学以及其同类必修马列毛邓好吗。这世界上又不是只有必修马列毛邓的大学。

    你首先给 REST 树了一个不存在的靶子让自己 YY 开火: REST 本来就只是在基于请求答复、基于 HTTP 的模型上有优势。我从来没有说过 REST 能解决任何的问题,而你也没有描述一个 REST 预期可以解决的问题。

    我一直在说,这么高的楼层里面讨论过的,大多数人所实践的做法,不是不 work ,而是 REST 在这些问题上可以解决得更好:好处在与,如果系统规模扩张后, REST 的做法有助于保持低耦合高开发效率,而不是说这些做法在其所在实践环境中效率不够。

    鬼知道你理解成什么东西了,什么全称命题、任意场。
        202
    Balthild   94 天前
    @noli

    1. 必修马哲是国家政策规定的好不,除非你不是国内读的大学。鉴于你没有强调,我默认你是国内读的。

    2. 你难道不是自己说过,没有什么是抽象不成资源来给 REST 解决的吗?

    3. 我一直说的就是「而是 REST 在这些问题上可以解决得更好」这一个命题不一定成立,要看具体场合。

    4. 已经说过了,是「任意场合」打少了一个字。至于全称命题,类似「所有 XXX 都 YYY 」就是全称命题,这算高中水平的知识。
    1  2  3  
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   653 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.7.5 · 49ms · UTC 18:40 · PVG 02:40 · LAX 11:40 · JFK 14:40
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1