我正在使用Retrofit连接到用户可配置的URL,我遇到的问题是如何处理空白URL。正如预期的那样,当服务器为空/空时,RestAdapter.Builder会抛出IllegalArgumentException,这意味着无法调用create来生成改进接口,从而为我留下了空接口。
例如,使用以下API接口;
interface IApiService {
@POST("/{path}/api/{userid}/calls/Action")
void startCall(@Path("path") String path, @Path("userid") String userid, @Body Action action, Callback<Response> callback);
@PUT("/{path}/api/{userid}/calls/Action")
void addToCall(@Path("path") String path, @Path("userid") String userid, @Body Action action, Callback<Response> callback);
}
我为Retrofit接口创建了一个包装类,因为回调类型是Retrofit Callback,我希望能够在需要时将其交换出来。
public class ApiServiceWrapper implements IAPiServiceWrapper {
private IApiService mAPiService;
@Inject
ApiServiceWrapper(Settings settings, RequestInterceptor requestInterceptor) {
RestAdapter restAdapter = new RestAdapter.Builder()
.setServer(settings.getUrl())
.setRequestInterceptor(requestInterceptor)
.setConverter(new ActionConverter())
.build();
mAPiService = restAdapter.create(IApiService.class);
}
public void startCall(String path, String userid, Action action, final IApiResultCallback<Response> callback) {
mAPiService.startCall(path, userid, action, new Callback<Response>() {
@Override
public void success(Response response, Response response2) {
callback.success();
}
@Override
public void failure(RetrofitError error) {
callback.failure(error.getResponse().getReason());
}
});
}
public void addToCall(String path, String userid, Action action, final IApiResultCallback<Response> callback) {
mAPiService.addToCall(path, userid, action, new Callback<Response>() {
@Override
public void success(Response response, Response response2) {
callback.success();
}
@Override
public void failure(RetrofitError error) {
callback.failure(error.getResponse().getReason());
}
});
}
}
那么我应该如何处理RestAdapter.Builder抛出的异常?
在我看来,检查settings.getUrl()是否返回有效的URL似乎是明智的,如果确实如此,则使用Retrofit填充界面。但是当URL为空时我如何处理这种情况,一种解决方案是检查null,例如;
public void startCall(String path, String userid, Action action, final IApiResultCallback<Response> callback) {
if (mAPiService != null) {
mAPiService.startCall(path, userid, action, new Callback<Response>() {
@Override
public void success(Response response, Response response2) {
callback.success();
}
@Override
public void failure(RetrofitError error) {
callback.failure(error.getResponse().getReason());
}
});
} else {
callback.failure("Some reason here :D");
}
}
这可行,但我的API接口非常大,我宁愿不必在每次调用时检查null。
如果我可以将mAPiService设置为一个无效的实现,例如可以立即调用失败,那么会有什么好处的呢?
@Inject
ApiServiceWrapper(Settings settings, RequestInterceptor requestInterceptor) {
if (TextUtils.isEmpty(settings.getUrl())) {
mAPiService = new InvalidSettingsApiService("some error")
} else {
RestAdapter restAdapter = new RestAdapter.Builder()
.setServer(settings.getUrl())
.setRequestInterceptor(requestInterceptor)
.setConverter(new ActionConverter())
.build();
mAPiService = restAdapter.create(IApiService.class);
}
}
但这是不可能的,因为IApiService接口使用Retrofit Callback接口,该接口需要RetrofitError的失败参数。
我列出的任何选项都可以吗?或者是否有更好的解决方案来处理无法生成界面的情况?
答案 0 :(得分:1)
我正在使用Retrofit连接到用户可配置的网址...
您应立即验证并拒绝其来源的空白网址。您的应用应该永远不足以构建带有无效网址的RestAdapter
。
立即拒绝的一个重要原因是避免掩盖问题。如果存在不良数据,则需要立即显示,而不是将其隐藏在拒绝API调用的接口的假实现之后。