作者回复: 这其实是个很好的问题。
我对 GraphQL 的理解简单来说是这样的,仅供参考。它本质上是一种声明式的 DSL,把接口逻辑从服务端拿到客户端来,客户端来决定做什么查询,执行什么操作,资源的概念被彻底弱化了。
和基于资源的 REST 相比,因为可以更加细粒度地控制需要什么数据,减少了多次调用或者是不需要的数据返回造成的开销。当然,它也有许多弱点,比如复杂性更高(客户端需要理解复杂的业务数据模型),不容易使用缓存等等。
我觉得它应该是 REST 风格的一种补充,而不是绝对的替代。有很多场景,比如复杂的数据查询,使用 GraphQL 可以做得很灵活,且有比较高的效率。而多数业务场景,REST 确是更好的选择。
作者回复: 感谢回答。
关于 1,我觉得你说得很好。路径传递“隐含”了这个 key,而使用 Query String 的键值对的方式,则显式指定了 key。从这个角度来说,确实后者更为“明确”。
但是,“可读性”并不一定是指定了 key 的更好,可读性毕竟是一个和个人理解密切相关的判断。通常在路径层次较短,且路径的定义符合人的认知的时候(比如“资源/分类/唯一ID”,这样由大到小的递进),路径传递参数的方式也具有很高的可读性。
在使用框架处理的难度方面,我认为这两种方式并没有太大区别。
另外,使用 Query String 的方式灵活性上要更高,比如可以通过合理的配置自动构造和注入一个复杂的参数对象,这方面我们会在下一章学到。
关于 2,说得非常好,这种把一个复杂行为转变为可进行 CRUD 的“资源”,就是一种很有效的处理方法。
对于你最后关于鉴权和授权的问题,我计划在第 5 章谈到。
作者回复: 看场景了。对于 Web API 来说,如果是一个命令接口,常常见到返回 204,表示操作成功,但不需要消息体。
作者回复: 👍
作者回复: 这个问题太大,不是很好回答。个人觉得这两个概念基本上还是在两个不同维度上,不是很适合放到一起比较。:)
作者回复: 👍,说得很好。
作者回复: 感谢评价!