使用REST发布项目列表

使用REST发布项目列表,rest,post,Rest,Post,我正在寻找一个约定,当我有一个(长的)要发布到服务器的项目列表时,如何序列化数据 例如,如果我有一个资源/users,我想发布一个新的资源,我会对新用户的字段进行http编码,并将其放入请求正文中,如下所示:name=foo&age=20 但是如果我有一个用户列表,像这样的[{name:'foo',age:20},{name:'bar',age:10}],有没有一个常规的方式发布这个 我在想name[0]=foo&age[0]=20&name[1]=bar&age[1]=10,但我找不到任何支持

我正在寻找一个约定,当我有一个(长的)要发布到服务器的项目列表时,如何序列化数据

例如,如果我有一个资源
/users
,我想发布一个新的资源,我会对新用户的字段进行http编码,并将其放入请求正文中,如下所示:
name=foo&age=20

但是如果我有一个用户列表,像这样的
[{name:'foo',age:20},{name:'bar',age:10}]
,有没有一个常规的方式发布这个


我在想
name[0]=foo&age[0]=20&name[1]=bar&age[1]=10
,但我找不到任何支持它的东西。web服务器通常接受/期望什么?

一个可能会改变我答案的快速问题:您是直接从HTML表单发布,还是期望更复杂的东西(例如javascript处理,或者甚至不是基于web的客户端)

如果您有一个足够复杂的客户机,您可以构造一个JSON字符串,并使用
application/JSON
的内容类型发布。然后,处理POST的任何资源都可以使用任意数量的json库来读取POST字符串并按原样处理

进一步漫谈: 您使用什么框架/语言构建REST服务?他们是否有内置的功能/约定来帮助您

例如,如果您正在使用JAX-RS构建您的服务,那么有一个内置的注释可用于处理发布的表单。。。例如:如果您发布的内容类型为
application/x-www-form-urlencoded
name=foo&age=20&name=bar&age=10

您可以通过以下方式在服务端检索并行列表:

@POST
@Consumes("application/x-www-form-urlencoded")
public void createUsers(@FormParam("name") List<String> name, @FormParam("age") List<String> age) {
    // Store your users
}
@POST
@使用(“应用程序/x-www-form-urlencoded”)
public void createUsers(@FormParam(“name”)列表名,@FormParam(“age”)列表年龄){
//存储您的用户
}
但是你必须处理这样一个问题:如果一个列表比另一个短/长,你如何解决这个问题?如果创建用户列表需要或可选一个新字段,会发生什么情况?(但正如我最初提到的,JSON对象的JSON数组可以解决这个问题……有许多库支持JAX-RS中的automagic JSON反序列化,或者也可以选择创建自己的库

(下一节的免责声明:我不了解rails,我在Java服务领域的经验更多……我正是基于此)。看起来rails有一个约定,即
name[]=foo&name[]=bar
自动将发布的数据处理到数组中,还有一个类似的约定来填充结构,如
user[name]=foo&user[age]=20
…如果您在rails上,是否有某种方法可以使用/滥用这两种功能来获得所需的结果


其他REST框架和语言可能有自己的约定和功能:)

Rails以与您建议的格式相似的格式序列化表单。如果您有一个嵌套模型,它会这样编码:

name=theo&company[name]=acme
(等效的JSON应该是
{“name”:“theo”,“company”:{“name”:“acme”}}

我不能说我见过Rails应用程序发送数组,但没有理由认为它不起作用(最坏的情况是,最终会得到一个带有字符串键的散列)

PHP还有另一个约定,如果你想发送一个数组,你可以这样做

names[]=alice&names[]=bob&names[]=steve
但我不知道你是怎么做嵌套对象的

HTTP规范,或者如果它是URI规范(不确定是哪个atm),实际上指定如果多次传递相同的参数,则会获得值数组(而不是大多数应用程序框架的最后一次wins行为)。您可以在Jetty的API文档中看到这一点,例如:)

然而,这大部分适用于
GET
请求,不一定是
POST
(但
application/x-url-encoded
可能应遵循与
GET
相同的标准)

简言之,我不认为有这样做的标准,
POST
body是一个有点狂野的西部领地。然而,我认为要么你应该使用JSON,因为它是用来描述结构的,而
application/x-url-encoded
不是,要么你应该尝试更好地表示数据的结构,比如:

users[0][name]=foo&users[0][age]=20&users[1][name]=bar&users[1][age]=10

例如,Rails应用程序有可能在开箱即用的情况下对其进行解释。

它比HTML表单更复杂。我可以在发送之前进行任何处理。正如您所建议的,我已经考虑将数据序列化为JSON,但我不确定它是否是常规的。如果你说的话很普遍,那么这肯定是一条路要走。我的直觉告诉我,JSON甚至有点过于通用,因为数据嵌套的深度从来没有像我的示例中那样深。以前如何解决这个问题的一些例子将非常好!对不起,我刚才正全神贯注地闲聊,刚刚看到了你的评论。:)tl;博士我在文章中第二点的版本:您是否已经找到了REST服务的框架?他们是否有这样的内置约定(这将使您的生活更轻松)?每个人都有一个非常好的观点,即最重要的是您的服务器端将接受什么(这在某种程度上意味着这类东西没有真正的标准——我不认为早在网络先驱时代编写规范的人就预见到了分级内容)。