如何使用 rxjava 在 retrofit 2.0 中获取请求 url?

新手上路,请多包涵

我正在尝试升级到 Retrofit 2.0 并在我的 android 项目中添加 RxJava。我正在调用 api 并希望检索 url 并将其与 sqlite 中的响应数据一起作为缓存

Observable<MyResponseObject> apiCall(@Body body);

在 RxJava 调用中:

 myRetrofitObject.apiCall(body).subscribe(new Subscriber<MyResponseObject>() {
    @Override
    public void onCompleted() {

    }

    @Override
    public void onError(Throwable e) {

    }

    @Override
    public void onNext(MyResponseObject myResponseObject) {

    }
});

在 Retrofit 1.9 中,我们可以在成功回调中获取 url:

         @Override
        public void success(MyResponseObject object, Response response) {
            String url=response.getUrl();
            //save object data and url to sqlite
        }

你如何使用 RxJava 在 Retrofit 2.0 中做到这一点?

原文由 Stackoverflow 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 871
2 个回答

更新:

再次阅读问题后:

如果您想访问原始响应,您需要将 API 接口定义为:

 Observable<Response<MyResponseObject>> apiCall(@Body body);

代替:

 Observable<MyResponseObject> apiCall(@Body body);

您可以使用以下方法获取 Url:

 response.raw().request().url()

这里:

response 是Retrofit的回应

raw 是来自OkHttp的响应

request 是来自 OkHttp 的请求,其中包含 Url 作为 HttpUrl

原文由 LordRaydenMK 发布,翻译遵循 CC BY-SA 3.0 许可协议

API 使用 rxjava 使用以下代码

创建类名 API

 public class Api {

private static final String BASE_URL="https://your_url";

private static Api instance;
private final IApiCall iApiCallInterface;

private Api() {
    Gson gson = new GsonBuilder().setLenient().create();
    final OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .connectTimeout(60, TimeUnit.SECONDS)
            .writeTimeout(60, TimeUnit.SECONDS)
            .readTimeout(60, TimeUnit.SECONDS)
            .build();
    Retrofit retrofit = new Retrofit.Builder().client(okHttpClient).baseUrl(BASE_URL)
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create(gson)).build();

    iApiCallInterface = retrofit.create(IApiCall.class);
}

public static Api start() {
    return instance = instance == null ? new Api() : instance;
}

public Observable<Example> getSendMoneyCountries() {
    return iApiCallInterface.getCategoryList();
}
}

Crete Interface name IApiCall 在这里你可以做出你所有的其他 API 请求

public interface IApiCall {
  //response in in json array
  @Headers("Content-Type: application/json")
  @GET("/json")
   Observable<Example> getCategoryList();
}

在您的 MainActivity.java

     private static Api api;
    api = Api.start();
    api.getSendMoneyCountries()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeWith(new DisposableObserver<Example>() {
                @Override
                public void onNext(Example response) {
                    //Handle logic
                    try {
                        populateCountryList(response);
                    }catch (Exception e)
                    {
                        finish();
                        Toast.makeText(MainActivity.this,"Unable to send money",Toast.LENGTH_SHORT).show();
                        //MainActivity.showTimeoutDialog();
                        e.printStackTrace();
                    }
                }

                @Override
                public void onError(Throwable e) {
                    //Handle error
                    Toast.makeText(MainActivity.this, "Error", Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onComplete() {
                }
            });

原文由 Sagar 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题