根据HTTP/1.1规范:
该
POST方法用来请求原始服务器接受被附在请求由标识的资源的新下属实体Request-URI的Request-Line
换句话说,POST用于创建.
该
PUT方法请求将所包含的实体存储在提供的实体下Request-URI.如果Request-URI引用已经存在的资源,则封闭的实体应该被视为驻留在源服务器上的实体的修改版本.如果Request-URI未指向现有资源,并且该URI能够被请求用户代理定义为新资源,则源服务器可以使用该URI创建资源.
也就是说,PUT用于创建或更新.
那么,应该使用哪一个来创建资源?或者需要支持两者?
学术界认为表名应该是他们存储属性的实体的单数.
我不喜欢任何需要在名称周围使用方括号的T-SQL,但我已经将Users表重命名为单数,永远判断那些使用表的人有时必须使用括号.  
我的直觉是,保持单数是更正确的,但我的直觉也是括号表示不受欢迎的人,如列名,其中有空格等.
我应该走还是留?
这可能是一个愚蠢的问题,但我有一个晚上.在我正在开发RESTful API的应用程序中,我们希望客户端以JSON格式发送数据.此应用程序的一部分要求客户端上载文件(通常是图像)以及有关图像的信息.
我很难跟踪单个请求中如何发生这种情况.是否可以将文件数据Base64转换为JSON字符串?我是否需要向服务器发送2个帖子?我不应该为此使用JSON吗?
作为旁注,我们在后端使用Grails,这些服务由本机移动客户端(iPhone,Android等)访问,如果其中任何一个有所不同.
一个简单的REST API:
现在有问题的API扩展:
我现在对DELETE和PUT操作回收功能感兴趣,可以通过PUT/DELETE项目/ {id}轻松访问.
问题:提供这样的API是否常见?
替代方案:在单一连接的时代发出多个请求的多个请求很便宜,并且由于更改成功或失败,但是在NOSQL数据库时代,即使请求处理已经消失,列表中的更改也可能已经发生,因此会更加原子化内部服务器或任何由于任何原因.
[UPDATE]
在考虑了白宫Web标准和维基百科:REST示例之后,现在使用以下示例API:
一个简单的REST API:
最佳资源API:
不支持和禁止PUT和DELETE on/items.
使用POST似乎可以成为在封闭资源中创建新项目而不替换但附加的技巧.
HTTP语义POST读取:
通过追加操作扩展数据库
PUT方法需要替换完整集合以返回HTTP语义PUT引用的等效表示:
给定表示的成功PUT将表明对该相同目标资源的后续GET将导致在200(OK)响应中返回等效表示.
[UPDATE2]
对于多个对象的更新方面似乎更加一致的替代方案似乎是PATCH方法.PUT和PATCH之间的区别在RFC 5789草案中描述为:
PUT和PATCH请求之间的差异反映在服务器处理封闭实体以修改Request-URI标识的资源的方式中.在PUT请求中,封闭的实体被认为是存储在源服务器上的资源的修改版本,并且客户端正在请求替换所存储的版本.但是,对于PATCH,随附的实体包含一组指令,这些指令描述了如何修改当前驻留在源服务器上的资源以生成新版本.PATCH方法影响Request-URI标识的资源,它也可能对其他资源产生副作用; 即,可以通过应用PATCH来创建新资源,或者修改现有资源.
因此,与POST相比,PATCH也可能是一个更好的主意,因为PATCH允许UPDATE,因为POST只允许添加意味着添加而没有修改机会的东西.
所以POST在这里似乎是错误的,我们需要将我们提出的API更改为:
一个简单的REST API:
假设我有以下关系数据结构(例如):
A `post` which is a child of a `category`
可以通过以下API端点访问此数据:
GET /category/1GET /category/1/post/1GET /category/1/post/2我现在决定要使用我的API删除category 1所以我运行DELETE /category/1.
但是,category 1如果没有类别,关系子子帖子元素不能存在,您是否希望此调用失败并说您必须先删除子元素或者在删除类别时自动递归删除子元素?
如果我决定对所有路线名称都使用复数形式,但某些资源仅作为一件事存在,您是否将其保留为单数形式(更直观),还是尊重使用复数形式的决定并保持这种方式?
我们正在使用PHP为客户门户网站设计新的API,并且出现了类似的情况:
/ api / orders / or-a41931-0001 / special-agreement /
一个订单只能有一个特殊协议(顺便说一句,不能有其他类型的协议,所以我不能做/ agreements /?type = special或类似的东西)。
/ special-agreements /是典型的做法吗?如果订单必须正好有一个,则使用/ special-agreement / ?
rest ×5
json ×2
api-design ×1
file-upload ×1
grails ×1
http ×1
post ×1
put ×1
sql ×1
sql-server ×1