如何调解REST和JSONschema?

时间:2015-10-07 14:48:47

标签: python rest extjs pyramid jsonschema

我正在开始一个包含带有金字塔/ python后端的Extjs 6应用程序的新项目。

由于这种架构,后端只提供RPC,不会直接为任何页面提供服务。我对这种事情的实现通常基于REST,并且很适合这个CRUD应用程序。

关于数据验证我想从Colander / Peppercorn转移到我总是觉得更简单,更简化的jsonschema。

这里的想法是将所有参数 - 减去url中包含的id(在这种情况下) - 将各种请求移动到json体中可以轻松处理的json体中。

这里的主要问题是GET请求不应该有一个正文,我肯定想在那里放置参数(过滤器,分页等)。

可能有一些REST或类似于JSONschema的方法,但我无法在网上找到任何内容。

编辑:有人在GET HTTP请求中提到了有关正文的问题。虽然在某种程度上将一个正文放入GET HTTP请求中,但它违反了HTTP 1.1规范的一部分,因此这不是解决此问题的方法。

3 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望使用JSON Schema进行输入验证,但是您正在努力弄清楚如何以RESTful方式使用JSON Schema验证查询参数。

不幸的是,没有确定的答案。 JSON Schema并没有为此设计。以下是我在自己的REST和JSON Schema工作中考虑的选项。

  1. 将查询参数转换为JSON,然后根据架构进行验证
  2. 将您的JSON存入查询参数并验证该参数的值。 (即/ foo / 1?params = {" page":2," perPage":10})
  3. 当人们告诉你做错了REST时,使用POST代替GET并将手指放在耳朵里。他们还知道什么。
  4. 我更喜欢选项1,因为它是惯用的HTTP。

    选项2可能是最容易在后端使用的,但它很脏。

    选项3主要是一个笑话,但严肃地说,REST或HTTP中没有任何内容表明POST只能用于创建。实际上,它是HTTP方法中最灵活和最通用的。把它想象成一个做某事的工厂。某些东西可以生成并存储新资源或只是返回它。如果您发现需要发送大量查询参数,那么它可能并不是一个简单的GET。我的经验法则是,如果结果本身不是可缓存的,那么POST可能更合适(或者至少不合适)。

答案 1 :(得分:0)

我不知道为什么你需要做任何特定的事情。在Pylons中,request.GET返回查询字符串中参数的字典(实际上是一个MultiDict,但基本上是相同的)。您可以轻松地将其转换为JSON或直接将其传递给架构验证。

答案 2 :(得分:0)

最干净的是将JSON字符串放在单个查询参数中。如果你有一个JSON Schema来验证它,那么客户端可以使用相同的JSON Schema,因此已经有了JSON格式的数据。

http://example.net/some/model/1?query={"foo":1,"bar":["baz","qux"]}

如果由于某种原因不喜欢在查询中使用JSON,则可以使用标准来转换查询参数。 There is no universally agreed-upon specification for param strings,但有一些做法,取决于语言和框架/库。

示例:http://example.net/some/model/1?foo=1,bar[]=baz,bar[]=qux

对于新用户来说可能看起来更干净,但如果客户端使用可以不同方式查询JSON的lib /语言,则会更加困难。