我正在开始一个包含带有金字塔/ python后端的Extjs 6应用程序的新项目。
由于这种架构,后端只提供RPC,不会直接为任何页面提供服务。我对这种事情的实现通常基于REST,并且很适合这个CRUD应用程序。
关于数据验证我想从Colander / Peppercorn转移到我总是觉得更简单,更简化的jsonschema。
这里的想法是将所有参数 - 减去url中包含的id(在这种情况下) - 将各种请求移动到json体中可以轻松处理的json体中。
这里的主要问题是GET请求不应该有一个正文,我肯定想在那里放置参数(过滤器,分页等)。
可能有一些REST或类似于JSONschema的方法,但我无法在网上找到任何内容。
编辑:有人在GET HTTP请求中提到了有关正文的问题。虽然在某种程度上将一个正文放入GET HTTP请求中,但它违反了HTTP 1.1规范的一部分,因此这不是解决此问题的方法。
答案 0 :(得分:1)
如果我理解正确,您希望使用JSON Schema进行输入验证,但是您正在努力弄清楚如何以RESTful方式使用JSON Schema验证查询参数。
不幸的是,没有确定的答案。 JSON Schema并没有为此设计。以下是我在自己的REST和JSON Schema工作中考虑的选项。
我更喜欢选项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 /语言,则会更加困难。