我们正在推出一个新的REST API,我想要一些关于如何格式化输入参数的最佳实践的社区意见:
现在,我们的API非常以JSON为中心(仅返回JSON).关于我们是否想要/需要返回XML的争论是一个单独的问题.
由于我们的API输出是以JSON为中心的,我们一直在走一条路,我们的输入有点以JSON为中心,我一直在想这可能对某些人来说很方便,但总的来说很奇怪.
例如,要获得一些产品详细信息,我们可以立即提取多个产品:
http://our.api.com/Product?id=["101404","7267261"]
Run Code Online (Sandbox Code Playgroud)
我们应该简化为:
http://our.api.com/Product?id=101404,7267261
Run Code Online (Sandbox Code Playgroud)
或者有JSON输入方便吗?更多的痛苦?
我们可能希望接受这两种风格,但这种灵活性是否会导致更多的混乱和头痛(可维护性,文档等)?
更复杂的情况是我们想要提供更复杂的输入.例如,如果我们想在搜索上允许多个过滤器:
http://our.api.com/Search?term=pumas&filters={"productType":["Clothing","Bags"],"color":["Black","Red"]}
Run Code Online (Sandbox Code Playgroud)
我们不一定要将过滤器类型(例如productType和颜色)作为请求名称,如下所示:
http://our.api.com/Search?term=pumas&productType=["Clothing","Bags"]&color=["Black","Red"]
Run Code Online (Sandbox Code Playgroud)
因为我们想要将所有过滤器输入组合在一起.
最后,这真的很重要吗?可能有很多JSON实用程序,输入类型并不重要.
我知道我们的JavaScript客户端对API进行AJAX调用可能会欣赏JSON输入以使他们的生活更轻松.
让我们假设有两个资源Binder
,并Doc
具有关联关系意味着Doc
和Binder
自己站.Doc
可能属于也可能不属于Binder
且Binder
可能为空.
如果我想设计一个REST API,允许用户发送一个Doc
s 的集合,在单个请求中,如下所示:
{
"docs": [
{"doc_number": 1, "binder": 1},
{"doc_number": 5, "binder": 8},
{"doc_number": 6, "binder": 3}
]
}
Run Code Online (Sandbox Code Playgroud)
对于每个文档docs
,
doc
存在则将其分配给Binder
doc
不存在,请创建它然后分配它我真的很困惑这应该如何实现:
/binders/docs
?我有以下消息(略有变化):
"参加比赛到2011年1月30日,你可以赢得最多★ - 包括惊人的夏季旅行!"
我目前有:
<p style="font-size:14px; color:#538b01; font-weight:bold; font-style:italic;">
Run Code Online (Sandbox Code Playgroud)
格式化文本字符串,但想要将"2011年1月30日"的颜色更改为#FF0000,将"summer"更改为#0000A0.
如何使用HTML或内联CSS严格执行此操作?
使用django-rest-framework 3.0并拥有以下简单模型:
class Book(models.Model):
title = models.CharField(max_length=50)
class Page(models.Model):
book = models.ForeignKey(Books, related_name='related_book')
text = models.CharField(max_length=500)
Run Code Online (Sandbox Code Playgroud)
并且给出了这个JSON请求:
{
"book_id":1,
"pages":[
{
"page_id":2,
"text":"loremipsum"
},
{
"page_id":4,
"text":"loremipsum"
}
]
}
Run Code Online (Sandbox Code Playgroud)
如何编写嵌套的序列化程序来处理此JSON,并为page
给定的每个JSON book
创建新页面或更新(如果存在).
class RequestSerializer(serializers.Serializer):
book_id = serializers.IntegerField()
page = PageSerializer(many=True)
class PageSerializer(serializers.ModelSerializer):
class Meta:
model = Page
Run Code Online (Sandbox Code Playgroud)
我知道用一个实例化序列化器instance
会更新当前的序列化器,但我应该如何在create
嵌套序列化器的方法中使用它?
我有一些CSV数据,我想使用示例CSV数据导入django模型:
1;"02-01-101101";"Worm Gear HRF 50";"Ratio 1 : 10";"input shaft, output shaft, direction A, color dark green";
2;"02-01-101102";"Worm Gear HRF 50";"Ratio 1 : 20";"input shaft, output shaft, direction A, color dark green";
3;"02-01-101103";"Worm Gear HRF 50";"Ratio 1 : 30";"input shaft, output shaft, direction A, color dark green";
4;"02-01-101104";"Worm Gear HRF 50";"Ratio 1 : 40";"input shaft, output shaft, direction A, color dark green";
5;"02-01-101105";"Worm Gear HRF 50";"Ratio 1 : 50";"input shaft, output shaft, direction A, color dark green";
Run Code Online (Sandbox Code Playgroud)
我有一些名为Product的django型号.在产品还有像一些领域name
,description …
我无法找到做我想做的事情的正确语法.如果没有名称/值对,我想做点什么.这是我视图中的代码:
if (!request.POST['number']):
# do something
Run Code Online (Sandbox Code Playgroud)
完成上述事情的正确方法是什么?我尝试这个时遇到语法错误.
更新:
状态模式可能是解决此问题的错误方法.因此,欢迎任何其他模式.基本上我正在寻找一种方法来为每个州提供保护条件,同时拥有干净且可维护的代码.guard conditions
如果条件不满足,前端侧路由系统如emberjs,ui-router和react-router如何实现以避免进入特定状态?
我想通过使用State Pattern来实现一个有限状态机,但我无法绕过它.简而言之就像:
If error -> error state
If A && B && C -> second state
If only A -> first state
Run Code Online (Sandbox Code Playgroud)
在任何状态下,出错时,我们都会进入错误状态.输入(事件)A,B和C可能以任何顺序到达,但如果它们全部通过,我们将进入第二状态.如果只有输入A适用,那么我们进入第一状态.
以下状态图取自Martin Fowler的领域特定语言书.
在描述中他说:
格兰特小姐在她的卧室有一个秘密隔间,通常是锁定和隐藏的.要打开它,她必须关上门,然后打开胸口的第二个抽屉,按顺序打开她的床头灯.完成这些后,秘密小组将解锁,以便她打开.
我要强调,这turning light
并opening 2nd drawer
在发生任何顺序.与A,B和C相同
基于@SQLPolice的评论和书,我画了这个:
但问题是,我可能有(A && B && C && D && D && E).在这种情况下,拥有所有组合临时状态将是麻烦的.
我通常会尝试将流函数类型与其实现分开.我写的时候可读性稍高一些:
type Fn = string => string;
const aFn: Fn = name => `hello, ${ name }`;
Run Code Online (Sandbox Code Playgroud)
而不是:
const aFn = (name: string): string => `hello, ${ name }`;
Run Code Online (Sandbox Code Playgroud)
使用泛型类型时,我们可以写:
const j= <T>(i: T): T => i;
const jString: string = j('apple'); // ?
const jNumber: number = j(7); // ?
Run Code Online (Sandbox Code Playgroud)
但是如何将这种类型与函数表达式分开?
type H<T> = (input: T) => T;
const h:H<*> = i => i; // --> WHAT SHOULD GO FOR '*'?
const hString: string = h('apple'); // X error …
Run Code Online (Sandbox Code Playgroud) javascript generics parameterized-types flowtype arrow-functions
对于我的数据库中的模型,我需要为特定字段存储大约300个值.如果我使用Postgres特定的ArrayField而不是具有One-to-Many关系的单独表,那么在查询的性能和简单性方面会有什么缺点?
在Chrome开发者工具元素的标签中,如果通过单击按钮属性更改(class="menu-item"
- > class="menu-item active"
),您可以在元素上看到指示更改的紫色闪光.这非常有用,但在大型文档中,您必须深入扩展所有元素才能看到发生了什么.
有没有什么方法可以在发生交互时记录/列出所有DOM更改?不是专门用于Chrome,但任何其他工具都会很棒.将其视为diff
交互之前和之后的交互,但特定于CSS.