请教大家个问题,一个 post 接口如何实现处理多个业务请求?

2020-11-14 17:19:30 +08:00
 Yiso1573

最近做外部数据接入,对方文档里提供了一个 post 的服务地址,其他的业务参数都在请求体里( json 格式),然后里面有个 method 参数对应各个业务接口。

好奇他内部是如何实现的,我猜想的是接口解析这个参数再调用内部对应的服务,如果是这样那么这样设计的优劣势是什么?

其实主要问题是他们有部分接口是主动调用我们系统,实现方式和他们接口一毛一样,有点怕做得不规范,所以来请教下大家。java

2365 次点击
所在节点    程序员
14 条回复
boris93
2020-11-14 18:03:25 +08:00
做起来不就是
switch(method) {
case "methodA":
doMethodA(); break;
case "methodB":
doMethodB();break;
default:
fxxkItUp();break;
}

这种好像有点像过去 WebService 那种?一个 endpoint,请求里面带方法名这种操作。
现在应该是很不推荐这种做法了吧。

调你们接口的方式,你们说话管用那就按你们的办法来,不然就听他们的呗。什么是规范?谁说话好使谁就是规范。
chinvo
2020-11-14 18:11:21 +08:00
也可能是网关处理的
PHPer233
2020-11-14 18:23:29 +08:00
我见过这样的代码,就像一楼回复的那样执行相应的流程。
luob
2020-11-14 18:30:02 +08:00
graphql 直呼内行。

如果你试过手撸一个 web 框架会发现,这种编程式路由简单粗暴, 不用乱翻 http 各种标准一条条往上套,不用折腾来折腾去那一串乱七八糟的 url, 实现起来比 restful 那一套简单多了。
DarkCat123
2020-11-14 18:30:24 +08:00
mapping func.

type HandleFunc func( handerRequest) ( response , err );

act := make( map[string]HandleFunc);
return act[ methodRequest];
tesguest123
2020-11-14 18:39:33 +08:00
概括下就是通过 type 参数判断,if else if. else''
zliea
2020-11-14 19:15:44 +08:00
封装一个接口一个统一的入口方法,一个注解(功能号)。每个功能的 Service 实现这个接口,同时在 Service 上带上注解。
在程序初始化时把这些 service 放到 Map<功能号, service>,然后入口处解析到功能号然后调用入口方法。
PS. 我会把功能号放到 url 里。
dustinth
2020-11-14 19:29:55 +08:00
本质上和实现上没有区别, 只是 API 的表现方式不一样: 是把路由规则放到 http 规范层面还是放到业务层面. 做的好的, 切换两种方式可能就是一两行代码的事情.
mazyi
2020-11-14 22:03:36 +08:00
restful 的目的是规范,随便换一个人马上可以撸一套新的,这个嘛就是相反
VANHOR
2020-11-14 22:20:18 +08:00
饿了么的接口就是这样的。
hdfg159
2020-11-14 22:22:50 +08:00
就 if else,这思想就是消息分发器的思想,平时用地址区分那是 web 框架做好了
PopRain
2020-11-15 00:13:28 +08:00
有点像强类型和弱类型的调用,我还是喜欢有明确的方法(强类型)
namelosw
2020-11-15 00:20:30 +08:00
你要拿 REST 当规范的话, 这个不算 REST. REST 里面 POST 是用来创建资源的. 如果想 REST, 就要设计更多资源, 而不是更多的 verb 或者 method, 区别和这个挺大的.

本质上这个 diapatch 的方式是模拟 RPC, 方法+参数其实就是模拟一个远程的函数. 不过我觉得到没有太大问题, 就是团队达成一致就行. 还有就是不同情况返回值的类型要处理好就行.
Elissa
2020-11-15 01:29:40 +08:00
艹,这说的不就是我吗,野路子后端,php 写个 gateway.php ,接收 type 和 action,再用 switch 去分不同的业务接口

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

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

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

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

© 2021 V2EX