在GET中传递数组以进行REST调用

Chr*_*ney 51 rest restful-url restful-architecture

我有一个网址来为这样的用户获取约会:

/user/:userId/appointments
Run Code Online (Sandbox Code Playgroud)

如果我想为多个用户预约,网址应该如何?

它应该是:

/appointments?users=1d1,1d2..
Run Code Online (Sandbox Code Playgroud)

谢谢,克里斯.

bry*_*mac 66

集合是一种资源,因此/约会可以作为资源.

集合通常还通过查询字符串提供过滤器,这基本上是users = id1,id2 ... is.

所以,

/appointments?users=id1,id2 
Run Code Online (Sandbox Code Playgroud)

可以作为过滤的RESTful资源使用.

  • 如果您要传递 30 个键值对怎么办? (4认同)

sgr*_*454 9

我认为通常通过对它们进行JSON编码来序列化REST调用参数是一种更好的做法:

/appointments?users=[id1,id2]
Run Code Online (Sandbox Code Playgroud)

甚至:

/appointments?params={users:[id1,id2]}
Run Code Online (Sandbox Code Playgroud)

然后在服务器上取消编码.从长远来看,这将为您提供更大的灵活性.

在发送之前,请确保URLEncode params!

  • ?{users:[id1,id2]}不遵循?key1 = val2&key2 = val2的查询字符串参数约定. (2认同)
  • 另外,您是否有在查询字符串过滤器中提供序列化对象的主要服务的示例?据我所知,大多数都提供简单的逗号分隔选项过滤器或 OData 等查询格式 (2认同)

Gil*_*zan 8

另一种方法是,根据您选择的服务器架构/框架,这是有意义的,一遍又一遍地重复相同的论点.像这样的东西:

/appointments?users=id1&users=id2
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我建议使用单数参数名称:

/appointments?user=id1&user=id2
Run Code Online (Sandbox Code Playgroud)

这一点由Jersey(Java)等框架本身支持.有关详细信息,请查看此问题.


Rav*_*MCA 8

这对我有用。

/users?ids[]=id1&ids[]=id2
Run Code Online (Sandbox Code Playgroud)