比如,这是淘宝开放平台给我返回的一个报错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"
}
}
为什么要这么写, 别人写的接口,你说他为什么要这么写
你在教我做事?
主要是,好几家开放平台接口都这么拿一个根节点包裹着,我怕是我经验不足,少考虑了哪里,所以来问问
为了让调用者很容易知道这是一个“error_response”
嗯。我也这么思考过,但是我想的是,调用者都调用了,他还能不知道这是一个“”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"
}
}
如果按你这个想法,它这么设计大概是想让调用者很容易就知道这是一个 item_quantity_update_response ,看名字就知道它是 商品库存修改 返回的response
想起来有那么点道理,但是,既然我是调用者,我自己亲手调出来的response,我当然知道它是 商品修改库存 返回的response。
比起这点作用,带来的副作用我感觉更大了。比如我如果不用客户端去访问接口,拿到这个response后,我需要用newtonsoftjson来反序列化的话,我连定义实体类都需要多嵌套一层,所以我感觉如果是为了这个原因,有点得不偿失。
@LoveCoder: 不一定,比如有个api接口叫做:GetFuckMe,正常情况下会返回FuckMe实体,但是有时候由于某些原因出错了,返回一个Error实体。如果不能轻易从返回值看出所要表达的意思,也许阴差阳错,调用者会以为Error实体是FuckMe的意思。
@会长: 他出错的时候都是统一的error_response 包裹。
根节点除了error_response应该还有其他可能的字段吧?
没有,就是这么一个根节点,然后开始包裹着一个对象
@LoveCoder: 看名字是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"
}
}
@顾晓北: 我怀疑是不是,这一层包裹,是网关中心给加的,下游服务返回的是不带的?
@LoveCoder: emmmmm,这不是说明了?正常请求字段叫:item_quantity_update_response;异常就叫:error_response?
不好意思,回复晚了。我也在怀疑是网关中心给加的。但是他这么做的意图是什么呢?
我怀疑是不是网关中心给过结果后还有其他服务要根据response的类型来做一些日志记录之类的?
不然我实在想不通为什么要嵌套这么一层。
正常请求字段根据不同接口来变化。比如刚刚举例的 item_quantity_update_response ,这个是库存修改接口的response
还有比如其他的 item_price_update_response 这个是价格修改的接口的response。
可能是淘宝网关中心有一个流量监听者,他监听这个流量,分析这个最外层,以便能知晓这到底是什么接口的response?如果是这样子的话,他不是能监听请求的入参来确定吗?这个出参是入参决定的。
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; }
}
并不是,他的接收类不管最外面这一层,直接丢弃了
我现在不是纠结接收类怎么写的问题。我纠结的是这么设计json的好处。
@LoveCoder:
public class Response
{
public ErrR<Ta> error_response { get; set; }
public RightR<Tb> item_quantity_update_response { get; set; }
}
可能它这么输出的