这个 restful api 用着有点不顺手啊

2019-07-05 00:11:10 +08:00
 51300520

不是全部不顺手,而是参数写法

举个例子

获取张三写的文章

GET /aticle/writer/zhangsan

获取张三写的名叫 演员的自我修养 的文章

GET /aticle/writer/zhangsan/name/演员的自我修养

那参数里面有平级的怎么办?

获取张三写的名叫 演员的自我修养 和 编程宝典 这两文章

GET ????

网上列子大多是参数上下级的关系,那上下级和平级混合,那岂不是规则无法统一?甚至还有那些参数个数不确定的?

干脆要不要只取 restful 风格的一部分,只抽象成名词,参数还是传统的 url?arg1=xxx&arg2=yyy 这样好点?

2624 次点击
所在节点    问与答
13 条回复
2067
2019-07-05 00:26:21 +08:00
你这个不叫 restful 接口,restful 的查询都是放在 json 里面的...
51300520
2019-07-05 00:29:04 +08:00
@yujiaxin
我看网上的教程文档不就是我这种吗?
2067
2019-07-05 00:30:16 +08:00
正常的我理解的 restful,再包含多个属性的情况下应该是放在请求内容当中查询,只有完全非常清晰的树形结构才会用你写的这样的方式

GET /article

{
"writer":"zhangsan"
xxxx:xxxx
}

如此返回一个或者一组 ID 之后,再按 ID 去 GET
sls
2019-07-05 00:33:52 +08:00
反正我用着不爽,但还得用,因为你不用,领导觉得不行
chinvo
2019-07-05 00:35:47 +08:00
restful 又不是说完全没 query parameters

这种场景可以考虑把过滤器编码(如 JSON/url encode )之后作为 get 参数或者 post body
2067
2019-07-05 00:36:24 +08:00
@51300520 这种分层的结构适合于,每一层只有一种分类规则,而且不会发生交叉和重复的情况,而在这个情况下,一般是不需要特别指定参数的名字的

比如按照树形划分第一层是作者第二层是作品类型第三层是作品名称,那么就是
/article/zhangsan/action/演员的自我修养
/article/zhangsan/programming/编程宝典
/article/lisi/novel/xxxx

如果还有其他平级的分类标准,就不适合这样的分层,事实上无论是作者还是作品名或者作品类型其实都可以作为可选属性,比如
name:zhansan
type:programming
year:2008
name:编程宝典
这样的时候,应该是把这些属性存储起来,通过请求体里面的内容去查找,最终用 id 来获取
df4VW
2019-07-05 00:39:05 +08:00
演员的自我修养只是 article 这个 resource 的一个属性,没有特殊设计的话,做 query 的一部分就好了

restful 的中心是 resources


获取张三写的文章

GET /writers/zhangsan/articles

获取张三写的名叫 演员的自我修养 的文章

GET /writers/zhangsan/articles?names=

获取张三写的名叫 演员的自我修养 和 编程宝典 这两文章

GET /writers/zhangsan/articles?names[]=演员的自我修养&names[]=编程宝典
51300520
2019-07-05 00:48:48 +08:00
哎,用着别扭啊
FrankFang128
2019-07-05 01:02:49 +08:00
获取张三写的文章

GET /articles?author=张三

获取张三写的名叫 演员的自我修养 的文章

GET /articles?author=张三&title=演员的自我修养

获取张三写的名叫 演员的自我修养 和 编程宝典 这两文章

GET /articles?author=张三&title[]=演员的自我修养&title[]=编程宝典
catror
2019-07-05 01:03:23 +08:00
GET /articles/zhangsan
GET /articles/zhangsan/演员的自我修养

平级的调用多次,或者用 POST 请求,多个参数放 body 里
misaka19000
2019-07-05 01:23:11 +08:00
很简单
GET /articles/zhangsan/演员的自我修养,编程宝典

这样就可以了
dobelee
2019-07-05 01:26:44 +08:00
不建议把细节放到 QueryString,这样不便于扩展。放 body 里想怎么玩都行。
Windelight
2019-07-05 06:51:43 +08:00
应该是分次请求 json 最好,比如
首先是
HTTP/2 GET /writer/zhang3/work
HTTP/2 Response
{
"type"="work",
"writer"="zhang3",
"code"="success"
"info":[{
"id"=1
"name"=xxxxx
"time"=xxxxx
"abstract"=xxxxx
}
{
"id"=2
xxxxxxxxxx
xxxxxxxxxxxxxxx
}],
}
以此类推,接着 HTTP/2 GET /article/1
这里你可以自由发挥了,然后 Response
{
"type"="novel/sci/nature/cell"(爱咋编咋编)
"author"="zhang3"
"code"="success"
"content"="xxxxxxxxxxx"
}
因为你要的是 API,不是展现给用户的地址栏,干嘛把查询作者信息放在 Article 这个 Controller 下面呢?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/580157

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX