didi / DRouter

Android Router Framework
Apache License 2.0
743 stars 93 forks source link

如何正确得知路由失败原因 #57

Closed imcloud closed 1 year ago

imcloud commented 1 year ago

启动一个路由时,有可能被不同拦截器拦截,若想要知道为什么被拦截, 目前我自己的做法是自行put一个code数据,然后request的一方还必须要知道获取这个code的key。 我觉得这不是一个好的方式,潜规则意味着潜在风险。 最好是能有显示传达异常信息的方式。

weigao123 commented 1 year ago

你希望包含哪些异常信息,颗粒度是怎么样的,这个功能可以帮助你解决业务上的什么问题呢?

imcloud commented 1 year ago

你希望包含哪些异常信息,颗粒度是怎么样的,这个功能可以帮助你解决业务上的什么问题呢?

比如打开一本书时,第一层拦截是检查登录,第二层拦截是检查是否已付费购买,第二层还可以细分以包月制购买的是否到期,总之被拦截的可能性很多,但启动路由的一端却无从知晓。

设计上,最简单可以是一个code,也可以封装为一个error对象,我相信你们设计经验更丰富会找到合适的办法

weigao123 commented 1 year ago

是个好提议,现在的拦截和result是没有建立任何联系的,你应该是通过在request中增加了参数,这样确实不优雅,应该从result去拿比较合理。 是不是可以这样,在返回的result里增加一个statusCode属性,预定义几个,业务方也可以定义自己的。 在拦截的时候可以传递一个statusCode过来,这样在result中就可以获取到了

// status code example
// Users can customize their own status code
public static final int SUCCESS   = 200;
public static final int NOT_FOUND = 404;
public static final int INTERCEPT = 500;
weigao123 commented 1 year ago

// 拦截,附带错误码 request.getInterceptor().onInterrupt(500);

// 通过result中获取错误码 DRouter.build("/activity/interceptor") .start(this) { result -> Toast.makeText(this@MainActivity, "状态码: ${result.statusCode}", Toast.LENGTH_LONG).show() }

这样是否符合你的诉求?如果有更好的建议欢迎交流。

imcloud commented 1 year ago

// 拦截,附带错误码 request.getInterceptor().onInterrupt(500); // 通过result中获取错误码 DRouter.build("/activity/interceptor") .start(this) { result -> Toast.makeText(this@MainActivity, "状态码: ${result.statusCode}", Toast.LENGTH_LONG).show() }

这样是否符合你的诉求?如果有更好的建议欢迎交流。

是的,这样设计好很多

weigao123 commented 1 year ago

OK,代码已提交,感谢反馈 api 'io.github.didi:drouter-api:2.4.6'