gpt4 book ai didi

java - 如何处理Retrofit RestAdapter.Builder()异常?

转载 作者:行者123 更新时间:2023-12-01 13:24:05 26 4
gpt4 key购买 nike

我正在使用 Retrofit 连接到用户可配置的 URL,我遇到的问题是如何处理空白 URL。正如预期的那样,当服务器为 null/空白时,RestAdapter.Builder 会抛出 IllegalArgumentException,这意味着无法调用 create 来生成改造接口(interface),从而给我留下了一个 null 接口(interface)。

例如使用以下API接口(interface);

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 接口(interface)创建了一个包装类,因为回调类型是 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 接口(interface)非常大,我不想在每次调用时都检查 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 接口(interface)使用 Retrofit Callback 接口(interface),需要一个 RetrofitError 的失败参数。

我列出的任何选项都可以吗?或者有没有更好的解决方案来处理无法生成接口(interface)的情况?

最佳答案

I am using Retrofit to connect to a user configurable URL...

您应该立即验证并拒绝来自其来源的空白网址。您的应用永远不应该使用无效的 URL 来构建 RestAdapter

立即拒绝的一个重要原因是避免掩盖问题。如果存在不良数据,则需要在发现后立即将其显示出来,而不是将其隐藏在拒绝 API 调用的虚假接口(interface)实现后面。

关于java - 如何处理Retrofit RestAdapter.Builder()异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21879948/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com