6

请教一下,你们写接口的时候如果传入参数不合法,返回的结果是直接提示参数非法还是报...

 1 year ago
source link: https://www.v2ex.com/t/904703
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  程序员

请教一下,你们写接口的时候如果传入参数不合法,返回的结果是直接提示参数非法还是报错?

  InHello · 4 小时 24 分钟前 · 1830 次点击

比如有一个查询车辆详情的接口,参数定义的是车牌号,但是我做接口测试可能会传入纯数字、英文、null 等等这些正常参数外的其他字符。 我司返回来的结果直接报 java 错误,在我的理解中如果参数非法,返回的接口应该是提示用户"参数非法"而不是直接报一个 java 错误,不知道对不对。

31 条回复    2022-12-26 15:32:19 +08:00
nekoneko

nekoneko      4 小时 20 分钟前

对, 让后端统一处理一下返回信息
JYii

JYii      4 小时 19 分钟前

当然是捕捉参数异常丢出去,你同事那直接就是懒得处理
liprais

liprais      4 小时 19 分钟前

直接报 java 错误是抛异常?
抛异常说明有问题,用户不应该看到你内部的异常
cai88112

cai88112      4 小时 19 分钟前

InDom

InDom      4 小时 19 分钟前

报错误一般就是真的没在入口做检测, 后面莫名其妙在某个地方没按预期运行崩了.
不过入口参数检查的时候,如果不符合预期也可以使用报错的方式反馈.

但是这两种还是可以分出来的 如果 每次都完全不同的错误就属于前者, 如果每次错误提示都很相似, 大概率是第二个了.
k9982874

k9982874      4 小时 18 分钟前

直接爆堆栈就过分了,让后端加 validation
InHello

InHello      4 小时 17 分钟前

@liprais 抛异常的
wolfie

wolfie      4 小时 17 分钟前

序列化错误怎么算?
int32 类型,传 abc 。
yatoooon

yatoooon      4 小时 17 分钟前

后端统一处理
wong2

wong2      4 小时 16 分钟前

400 而非 500
InDom

InDom      4 小时 15 分钟前

但是 如果是后者 属于 预期内的错误, 是可以以可以预期的方式提供错误信息(比如按照接口规范返回与前端沟通过的特定格式的数据)

而非直接给了一个前端不曾预料的返回内容, 所以,不管怎样,如果出现了这个不可预期的返回,就是后端的锅.
InHello

InHello      4 小时 14 分钟前

@wong2 code 直接报 500 ,message 报异常
dd991

dd991      4 小时 9 分钟前

后端提示什么,直接展示出来就好,老板会让他改的
unco020511

unco020511      4 小时 6 分钟前

后端有框架可以很方便的校验参数有效性
AirBai2

AirBai2      4 小时 3 分钟前

http 状态码 400 ,外加 message
wangritian

wangritian      4 小时 0 分钟前

你是指报异常吗?确实不对,应该报业务或框架层级的错误
bthulu

bthulu      3 小时 53 分钟前

我一般是报 200, 数据返回默认值
lucays

lucays      3 小时 45 分钟前

总之报 500 肯定是有问题
200 还是 4xx 看公司内部规范。。。
wu00

wu00      3 小时 44 分钟前

参数错误,后端 validation+默认提示(给开发人员看的),前端自己也要做前端的 validation ,用户提示信息是前端自己定
业务错误,http 状态码 4xx ,给 errorType 和 message(给开发人员看的),前端根据 errorType 做页面逻辑和错误提示
服务端异常,http 状态码 500 ,前端给友好页面 /提示(稍后再试)
buchikoma

buchikoma      3 小时 42 分钟前

这种需要前后端定一下异常类型和异常提示,后端根据异常类型抛错误信息和 code ,前端根据 code 对错误信息进行包装抛给用户
xuanbg

xuanbg      2 小时 57 分钟前

直接抛异常那就是懒。嗯嗯,虽然我有时候也这样。
spring 是可以在实体类的字段上通过注解来对参数进行校验的。如果不是实体类,那也可以自己写校验逻辑。然后抛参数非法的异常出去就好了。

虽然,这样做意义其实也不是很大。但作为一个有追求的程序员,优雅是必须的。
Felldeadbird

Felldeadbird      2 小时 14 分钟前

按理来说应该提示非法参数。 估计后端没做处理,当非法提交后涉及到异常报错了,触发了 java 错误。

前端的做法应该是根据 code 或者 status 返回结果 执行对应的提示页或错误页。
hhjswf

hhjswf      1 小时 27 分钟前

说明没有做全局异常处理。
zypy333

zypy333      1 小时 26 分钟前

我想起来我的奇葩同事,写个传入楼层返回该楼层门禁点位 list ,然后他硬是写了个如果查不到数据手动抛个异常,但是实际上有的楼层确实是没有门禁报警器的,然后他还不愿意改,最后是前台想办法单独处理,遇到那个楼层,直接不请求后台
zypy333

zypy333      1 小时 15 分钟前

他应该不上 v 站

```java
public TableDataInfo list(@PathVariable String floor) throws Exception {
EntrancePoint entrancePoint=new EntrancePoint();
List<PublicEquipment> listOfep=new ArrayList<>();
List<EntrancePoint> list=null;
if(floor.isEmpty()){
throw new Exception("Please enter the number of floors");
}else {
entrancePoint.setFloor(floor);
list = entrancePointService.selectEntrancePointList(entrancePoint);
if(list.isEmpty()){
throw new Exception("The set or list cannot be empty!");
}else{
for (EntrancePoint entrancePoints:list) {
PublicEquipment pe =new PublicEquipment();
pe.setDeviceName(entrancePoints.getName());
pe.setIp(entrancePoints.getEntranceHost());
pe.setModelName(entrancePoints.getModelName());
pe.setState(entrancePoints.getEntranceStatus().equals("0")?"开启":"关闭");
pe.setDoorNum(entrancePoints.getVariable());
listOfep.add(pe);
}
}
}
return getDataTable(listOfep);
}
```
kop1989smurf

kop1989smurf      1 小时 11 分钟前

不能任凭异常抛出。

1 、异常需要全局处理,要有对应的类型编号、唯一编号、日志记录。
2 、未处理的异常会增大 web 容器的开销。
3 、不利于其他产品进行统一的错误提示。
InHello

InHello      1 小时 5 分钟前

@Felldeadbird 对的 就是这样的,但是前端也没有做任何异常处理
InHello

InHello      1 小时 4 分钟前

@zypy333 就是这种
InHello

InHello      1 小时 4 分钟前

@kop1989smurf 我感觉我司他们就没有做任何处理
YouTing

YouTing      16 分钟前

前后端都没有写校验,也没有抛出异常。前端至少要对 500 等未知错误进行提示,因为不知道什么时候就出奇奇怪怪的的问题,有提示用户就知道这一步不能干,后端的参数校验是必写的
zoharSoul

zoharSoul      14 分钟前

如果用户正常操作不会碰见的 case, 那什么文案无所谓的

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK