V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
51300520
V2EX  ›  问与答

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

  •  
  •   51300520 · 2019-07-05 00:11:10 +08:00 · 2457 次点击
    这是一个创建于 1754 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    举个例子

    获取张三写的文章

    GET /aticle/writer/zhangsan

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

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

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

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

    GET ????

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

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

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

    GET /article

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

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

    这种场景可以考虑把过滤器编码(如 JSON/url encode )之后作为 get 参数或者 post body
    2067
        6
    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
        7
    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
        8
    51300520  
    OP
       2019-07-05 00:48:48 +08:00
    哎,用着别扭啊
    FrankFang128
        9
    FrankFang128  
       2019-07-05 01:02:49 +08:00
    获取张三写的文章

    GET /articles?author=张三

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

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

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

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

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

    这样就可以了
    dobelee
        12
    dobelee  
       2019-07-05 01:26:44 +08:00 via Android
    不建议把细节放到 QueryString,这样不便于扩展。放 body 里想怎么玩都行。
    Windelight
        13
    Windelight  
       2019-07-05 06:51:43 +08:00 via Android
    应该是分次请求 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 下面呢?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3331 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 12:31 · PVG 20:31 · LAX 05:31 · JFK 08:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.