请教大家一个问题,如何设计 HTTP API 接口? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
yongchiu
V2EX    程序员

请教大家一个问题,如何设计 HTTP API 接口?

 
  •   yongchiu 2022-01-08 23:41:37 +08:00 3139 次点击
    这是一个创建于 1376 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在做开发的时候遇到一个问题,需要将以前三个接口完成的功能整合到一个功能里来,对于 POST 类的请求可以整合到 body 里,里面是由多个 JSON 组成的一个大 JSON 数据,这样做主要是参考 Google 的做法。 对于 GET 类的请求应该如何设计呢,GET 请求一般不用 body ,怎么用一个比较好的方式把三个接口的参数整合到一起?

    15 条回复    2022-01-09 21:52:07 +08:00
    rekulas
        1
    rekulas  
       2022-01-08 23:51:36 +08:00
    直接拼接倒 url 或者 (如果有冲突)装入 json 整个作为一个参数?
    反正作为 get 来说参数应该不多,如果参数太多还用 get ,感觉是有问题的
    rekulas
        2
    rekulas  
       2022-01-08 23:54:36 +08:00
    现在还有个 GraphQL 的新概念,需要后端配合修改据说可以多个 api 整合但是会增加不少工作量没用过
    yongchiu
        3
    yongchiu  
    OP
       2022-01-08 23:59:14 +08:00
    @rekulas 这是一个查询类的请求,查询一些数据的信息,因此考虑使用 GET 方法比较合适;装入 json 是怎么做呢? GET 请求能使用 JSON 吗?
    yongchiu
        4
    yongchiu  
    OP
       2022-01-09 00:01:24 +08:00
    @rekulas 主要是调用他人的 RPC 接口,RPC 只提供了两个接口,根据不同的参数返回不同的结果;因此 API 打算也按照 RPC 的接口进行设计,另一方面参考 Google 的 API 也是把多个接口的功能整合到了一个接口里面来
    rekulas
        5
    rekulas  
       2022-01-09 00:10:55 +08:00
    api?{"req1param":{},"re2param":{}}
    或考虑伪静态之类 api/{"req1param":{},"re2param":{}}

    参数也可以编码一下
    bombless
        6
    bombless  
       2022-01-09 04:56:16 +08:00 via Android
    get 也是可以放 body 的,不过你要预先测试一下你的服务端是否支持。我后端用的是 springboot 那套是可以的
    ktqFDx9m2Bvfq3y4
        7
    ktqFDx9m2Bvfq3y4  
       2022-01-09 05:34:21 +08:00 via iPhone
    有时候没必要完全按 rest 建议来,我的所有 api 都是 post ,就不会有这个问题。
    kop1989
        8
    kop1989  
       2022-01-09 07:43:50 +08:00 via iPhone
    可以拼在 URL 中,然后这个请求只有一个参数,其内容是 urlencode 过的、真正参数集合的序列化结果。

    当然,要考虑超长,不过查询应该问题不大
    rekulas
        9
    rekulas  
       2022-01-09 09:25:44 +08:00
    我也建议全部 post 来,rest 本身就不是一种足够完备的风格,如果全部机械式按 rest 设计只会带来更多麻烦不便
    iikebug
        10
    iikebug  
       2022-01-09 10:30:35 +08:00
    我自己写的接口都是 post 的,管你什么方法,前端舒服的一批
    yongchiu
        11
    yongchiu  
    OP
       2022-01-09 13:10:43 +08:00
    @bombless 后端不支持带 body
    yongchiu
        12
    yongchiu  
    OP
       2022-01-09 13:11:43 +08:00
    @kop1989 这样的话,还是需要设计多个参数吧,把这些参数统一序列化传递给后端进行解析,是这个意思吗?
    yongchiu
        13
    yongchiu  
    OP
       2022-01-09 13:12:33 +08:00
    @rekulas 我感觉都定义成 POST 可能会更好一些
    lisongeee
        14
    lisongeee  
       2022-01-09 20:16:31 +08:00
    有时候挺纠结 get 还是 post ,不能要求每个人不是傻逼,还不如直接用 json-rpc ,统一的规范比什么都好
    zqli92
        15
    zqli92  
       2022-01-09 21:52:07 +08:00
    一个建议:只用 get/post 方法,body 的数据结构可以看这个: https://hackertalk.net/post/202030390784430080
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5897 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 44ms UTC 02:24 PVG 10:24 LAX 19:24 JFK 22:24
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86