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

如何校验 JSON 数据?

  •  
  •   guyskk · 2016-07-06 22:14:54 +08:00 · 4971 次点击
    这是一个创建于 3068 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在的情况是前后端分离,后端只提供 API ,前端 AJAX 调用,使用 JSON 格式传送数据。 这里涉及到 2 个问题:
    (1)如何描述 API?如何告诉前端你的接口需要什么参数,返回什么?
    (2)如何校验 JSON 数据?前端可能漏了参数,或是传了错误的参数。用户可能输入错误,需要有错误提示。黑客也可能构造非法的参数进行攻击。

    考虑过用 JSON-Schema ,但是 JSON-Schema 太复杂了,写起来也很累,用来描述 API 并不合适,我想要一种易读易写的格式,写完可以直接拿来当文档看。

    另外关于防攻击的: https://github.com/pallets/flask/issues/1421
    如果提交大量嵌套非常深的数据,服务器资源不是很容易就会耗尽吗,例如: json.loads('[' * 800 + ']' * 800)

    求前人指路,分享经验。

    12 条回复    2016-07-07 09:48:27 +08:00
    loading
        1
    loading  
       2016-07-06 22:20:26 +08:00 via Android
    了解一下: Restful api
    guyskk
        2
    guyskk  
    OP
       2016-07-06 22:23:31 +08:00
    @loading 是 Restful api ,但也需要写文档描述请求参数和返回值吧
    loading
        3
    loading  
       2016-07-06 22:25:41 +08:00 via Android
    cuebyte
        4
    cuebyte  
       2016-07-06 22:44:19 +08:00   ❤️ 1
    JSON 校验好像只有 json schema 吧,文档的话可以看看 swagger 和 raml
    guyskk
        5
    guyskk  
    OP
       2016-07-06 22:48:48 +08:00
    @loading 麻烦先看明白题目,谢谢。

    这是你发的链接里关于文档的内容,泛泛而谈:
    ```
    文档

    文档和 API 本身一样重要。文档应该容易找到,并且公开(把它们藏到 pdf 里面或者存到需要登录的地方都不太好)。文档应该有展示请求和输出的例子:或者以点击链接的方式或者通过 curl 的方式(请见 openstack 的文档)。如果有更新(特别是公开的 API ),应该及时更新文档。文档中应该有关于何时弃用某个 API 的时间表以及详情。使用邮件列表或者博客记录是好方法。
    ```
    这种跟话题没关系的文章,麻烦不要随随便便就丢过来。
    guyskk
        6
    guyskk  
    OP
       2016-07-06 22:51:33 +08:00
    @cuebyte swagger 了解过,也挺复杂的。 RAML 我先了解一下再说。
    bdbai
        7
    bdbai  
       2016-07-06 23:49:23 +08:00 via Android   ❤️ 1
    (1) 什么都不要写,问问你的前端需要什么;
    (2) 用你自己的轮子嘛。
    loading
        8
    loading  
       2016-07-07 07:04:34 +08:00 via Android
    @guyskk 我没乱丢链接…
    你连你 api 需要提供什么都不知道,我不提供入门级资料还能提供啥?况且,你问题里都没提到 restful api 所以,我认为你还是不了解的。
    loading
        9
    loading  
       2016-07-07 07:06:43 +08:00 via Android
    既然你知道设计成 restful 风格很好,自己深挖这方面资料就行。
    guyskk
        10
    guyskk  
    OP
       2016-07-07 07:40:05 +08:00 via Android
    @bdbai 唉,自己的轮子不够好用,算法很复杂很难实现,所以想问问各位的经验,实际项目中是怎么做的?
    shyling
        11
    shyling  
       2016-07-07 08:25:05 +08:00 via Android   ❤️ 1
    第一个直接参考 V2EX 的 api 介绍
    第二个方便的方法是将 json 映射为 Model ,类型匹配上进行校验。该是 Number 的不能是 String 。
    lijinma
        12
    lijinma  
       2016-07-07 09:48:27 +08:00
    多年后,你还是会需要一个类似 swagger 的东西。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2676 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:14 · PVG 18:14 · LAX 02:14 · JFK 05:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.