前景提要
开放平台api设计问题,为什么返回的json结果都要拿根节点包裹,麻烦有经验的大佬帮我看看
0 悬赏园豆: 5 [待解决问题] 比如,这是淘宝开放平台给我返回的一个报错json,为什么它外层要加一个 error_response 包裹着呢?我看了一下客户端解析的时候的源代码,它是先去掉了外面这一层然后继续解析。换句话说这一层包裹的实际意义是什么?
我现在正在设计一个类似淘宝开放平台的开放平台,我在想为什么需要这一层?实际上有了这一层,如果不用它的客户端解析,反而更不方便解析,反倒需要多一层实体类,我看过好几个开放平台,他们都这么设计,所以是不是有我想不到的用处?按道理来说,不用erros_response这一层,解析起来不是更方便吗?求解答
{
"error_response": {
"code": 11,
"msg": "Insufficient isv permissions",
"sub_code": "isv.permission-ip-whitelist-limit",
"sub_msg": "The appkey 11111111 is only allowed to call from its ip white list, but the source ip 182.84.222.65 is not included",
"request_id": "abc12aaa"
}
}
又比如下面这个
{
"item_quantity_update_response": {
"item": {
"iid": "1111111",
"modified": "2020-05-28 14:44:12",
"num": 8,
"num_iid": 1111111,
"skus": {
}
},
"request_id": "123sdfsadfer"
}
} webapi 开放平台 webapi规范 LoveCoder | 初学一级 | 园豆: 4
提问于:2020-08-04 16:24 显示帮助
使用"Ctrl+Enter"可进行快捷提交,评论支持部分 Markdown 语法:[link](http://example.com) _italic_ **bold** `code`。
< > 分享
分享您的问题
所有回答(4) 0 为什么要这么写, 别人写的接口,你说他为什么要这么写
你在教我做事? 不知道风往哪儿吹 | 园豆:663 (小虾三级) | 2020-08-04 16:31 主要是,好几家开放平台接口都这么拿一个根节点包裹着,我怕是我经验不足,少考虑了哪里,所以来问问 支持( 0 ) 反对( 0 ) LoveCoder | 园豆:4 (初学一级) | 2020-08-04 16:32 编辑文本 预览 上传图片
Ctrl+Enter键快速提交 0 为了让调用者很容易知道这是一个“error_response” 会长 | 园豆:8280 (大侠五级) | 2020-08-04 16:42 嗯。我也这么思考过,但是我想的是,调用者都调用了,他还能不知道这是一个“”error_response”吗?可能我问题描述的不清楚,就算是其他结果,他也包裹着一个根节点。比如下面这个
{
"item_quantity_update_response": {
"item": {
"iid": "111111",
"modified": "2020-05-28 14:44:12",
"num": 8,
"num_iid": 111111,
"skus": {
}
},
"request_id": "4e7e4u21m1w7"
}
} 支持( 0 ) 反对( 0 ) LoveCoder | 园豆:4 (初学一级) | 2020-08-05 12:51 如果按你这个想法,它这么设计大概是想让调用者很容易就知道这是一个 item_quantity_update_response ,看名字就知道它是 商品库存修改 返回的response
想起来有那么点道理,但是,既然我是调用者,我自己亲手调出来的response,我当然知道它是 商品修改库存 返回的response。
比起这点作用,带来的副作用我感觉更大了。比如我如果不用客户端去访问接口,拿到这个response后,我需要用newtonsoftjson来反序列化的话,我连定义实体类都需要多嵌套一层,所以我感觉如果是为了这个原因,有点得不偿失。 支持( 0 ) 反对( 0 ) LoveCoder | 园豆:4 (初学一级) | 2020-08-05 12:56 @LoveCoder: 不一定,比如有个api接口叫做:GetFuckMe,正常情况下会返回FuckMe实体,但是有时候由于某些原因出错了,返回一个Error实体。如果不能轻易从返回值看出所要表达的意思,也许阴差阳错,调用者会以为Error实体是FuckMe的意思。 支持( 0 ) 反对( 0 ) 会长 | 园豆:8280 (大侠五级) | 2020-08-05 13:59 @会长: 他出错的时候都是统一的error_response 包裹。 支持( 0 ) 反对( 0 ) LoveCoder | 园豆:4 (初学一级) | 2020-08-08 14:28 编辑文本 预览 上传图片
Ctrl+Enter键快速提交 0 根节点除了error_response应该还有其他可能的字段吧? 顾晓北 | 园豆:10020 (专家六级) | 2020-08-04 17:11 没有,就是这么一个根节点,然后开始包裹着一个对象 支持( 0 ) 反对( 0 ) LoveCoder | 园豆:4 (初学一级) | 2020-08-05 12:49 @LoveCoder: 看名字是error_response,当正常的请求也是这一个字段? 支持( 0 ) 反对( 0 ) 顾晓北 | 园豆:10020 (专家六级) | 2020-08-05 13:45 @顾晓北: 这是一个正常请求,他也有一个类似的字段包裹着
{
"item_quantity_update_response": {
"item": {
"iid": "111111",
"modified": "2020-05-28 14:44:12",
"num": 8,
"num_iid": 111111,
"skus": {
}
},
"request_id": "4e7e4u21m1w7"
}
} 支持( 0 ) 反对( 0 ) LoveCoder | 园豆:4 (初学一级) | 2020-08-05 13:46 @顾晓北: 我怀疑是不是,这一层包裹,是网关中心给加的,下游服务返回的是不带的? 支持( 0 ) 反对( 0 ) LoveCoder | 园豆:4 (初学一级) | 2020-08-05 13:46 @LoveCoder: emmmmm,这不是说明了?正常请求字段叫:item_quantity_update_response;异常就叫:error_response? 支持( 0 ) 反对( 0 ) 顾晓北 | 园豆:10020 (专家六级) | 2020-08-05 13:55 不好意思,回复晚了。我也在怀疑是网关中心给加的。但是他这么做的意图是什么呢?
我怀疑是不是网关中心给过结果后还有其他服务要根据response的类型来做一些日志记录之类的?
不然我实在想不通为什么要嵌套这么一层。
正常请求字段根据不同接口来变化。比如刚刚举例的 item_quantity_update_response ,这个是库存修改接口的response
还有比如其他的 item_price_update_response 这个是价格修改的接口的response。 支持( 0 ) 反对( 0 ) LoveCoder | 园豆:4 (初学一级) | 2020-08-08 14:19 可能是淘宝网关中心有一个流量监听者,他监听这个流量,分析这个最外层,以便能知晓这到底是什么接口的response?如果是这样子的话,他不是能监听请求的入参来确定吗?这个出参是入参决定的。 支持( 0 ) 反对( 0 ) LoveCoder | 园豆:4 (初学一级) | 2020-08-08 14:24 编辑文本 预览 上传图片
Ctrl+Enter键快速提交 0 它的接收类可能是这样的 public class Response { public ErrR error_response { get; set; } public ItemR item_quantity_update_response { get; set; } } public class ErrR { public int code { get; set; } public string msg { get; set; } public string sub_code { get; set; } public string sub_msg { get; set; } public string request_id { get; set; } } public class ItemR { public Class1 item { get; set; } public string request_id { get; set; } } public class Class1 { public string iid { get; set; } public string modified { get; set; } public int num { get; set; } public int num_iid { get; set; } public Sku skus { get; set; } } public class Sku { public string id { get; set; } } pudu | 园豆:202 (菜鸟二级) | 2020-08-08 17:39 并不是,他的接收类不管最外面这一层,直接丢弃了 支持( 0 ) 反对( 0 ) LoveCoder | 园豆:4 (初学一级) | 2020-08-08 17:40 我现在不是纠结接收类怎么写的问题。我纠结的是这么设计json的好处。 支持( 0 ) 反对( 0 ) LoveCoder | 园豆:4 (初学一级) | 2020-08-08 17:41 @LoveCoder: public class Response { public ErrR<Ta> error_response { get; set; } public RightR<Tb> item_quantity_update_response { get; set; } }
可能它这么输出的 支持( 0 ) 反对( 0 ) pudu | 园豆:202 (菜鸟二级) | 2020-08-08 17:44 编辑文本 预览 上传图片
Ctrl+Enter键快速提交
清除回答草稿
您需要 登录 以后才能回答,未注册用户请先 注册 。