首页 新闻 会员 周边

开放平台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"
}
}

LoveCoder的主页 LoveCoder | 菜鸟二级 | 园豆:216
提问于:2020-08-04 16:24
< >
分享
所有回答(4)
0

为什么要这么写, 别人写的接口,你说他为什么要这么写
你在教我做事?

不知道风往哪儿吹 | 园豆:2035 (老鸟四级) | 2020-08-04 16:31

主要是,好几家开放平台接口都这么拿一个根节点包裹着,我怕是我经验不足,少考虑了哪里,所以来问问

支持(0) 反对(0) LoveCoder | 园豆:216 (菜鸟二级) | 2020-08-04 16:32
0

为了让调用者很容易知道这是一个“error_response”

会长 | 园豆:12401 (专家六级) | 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 | 园豆:216 (菜鸟二级) | 2020-08-05 12:51

如果按你这个想法,它这么设计大概是想让调用者很容易就知道这是一个 item_quantity_update_response ,看名字就知道它是 商品库存修改 返回的response
想起来有那么点道理,但是,既然我是调用者,我自己亲手调出来的response,我当然知道它是 商品修改库存 返回的response。
比起这点作用,带来的副作用我感觉更大了。比如我如果不用客户端去访问接口,拿到这个response后,我需要用newtonsoftjson来反序列化的话,我连定义实体类都需要多嵌套一层,所以我感觉如果是为了这个原因,有点得不偿失。

支持(0) 反对(0) LoveCoder | 园豆:216 (菜鸟二级) | 2020-08-05 12:56

@LoveCoder: 不一定,比如有个api接口叫做:GetFuckMe,正常情况下会返回FuckMe实体,但是有时候由于某些原因出错了,返回一个Error实体。如果不能轻易从返回值看出所要表达的意思,也许阴差阳错,调用者会以为Error实体是FuckMe的意思。

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2020-08-05 13:59

@会长: 他出错的时候都是统一的error_response 包裹。

支持(0) 反对(0) LoveCoder | 园豆:216 (菜鸟二级) | 2020-08-08 14:28
0

根节点除了error_response应该还有其他可能的字段吧?

顾晓北 | 园豆:10844 (专家六级) | 2020-08-04 17:11

没有,就是这么一个根节点,然后开始包裹着一个对象

支持(0) 反对(0) LoveCoder | 园豆:216 (菜鸟二级) | 2020-08-05 12:49

@LoveCoder: 看名字是error_response,当正常的请求也是这一个字段?

支持(0) 反对(0) 顾晓北 | 园豆:10844 (专家六级) | 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 | 园豆:216 (菜鸟二级) | 2020-08-05 13:46

@顾晓北: 我怀疑是不是,这一层包裹,是网关中心给加的,下游服务返回的是不带的?

支持(0) 反对(0) LoveCoder | 园豆:216 (菜鸟二级) | 2020-08-05 13:46

@LoveCoder: emmmmm,这不是说明了?正常请求字段叫:item_quantity_update_response;异常就叫:error_response?

支持(0) 反对(0) 顾晓北 | 园豆:10844 (专家六级) | 2020-08-05 13:55

不好意思,回复晚了。我也在怀疑是网关中心给加的。但是他这么做的意图是什么呢?
我怀疑是不是网关中心给过结果后还有其他服务要根据response的类型来做一些日志记录之类的?
不然我实在想不通为什么要嵌套这么一层。
正常请求字段根据不同接口来变化。比如刚刚举例的 item_quantity_update_response ,这个是库存修改接口的response
还有比如其他的 item_price_update_response 这个是价格修改的接口的response。

支持(0) 反对(0) LoveCoder | 园豆:216 (菜鸟二级) | 2020-08-08 14:19

可能是淘宝网关中心有一个流量监听者,他监听这个流量,分析这个最外层,以便能知晓这到底是什么接口的response?如果是这样子的话,他不是能监听请求的入参来确定吗?这个出参是入参决定的。

支持(0) 反对(0) LoveCoder | 园豆:216 (菜鸟二级) | 2020-08-08 14:24
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 | 园豆:216 (菜鸟二级) | 2020-08-08 17:40

我现在不是纠结接收类怎么写的问题。我纠结的是这么设计json的好处。

支持(0) 反对(0) LoveCoder | 园豆:216 (菜鸟二级) | 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
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册