android rx-java retrofit2

android - ¿Cómo obtener la url de solicitud en actualización 2.0 con rxjava?



rx-java retrofit2 (2)

Actualizar:

Después de leer la pregunta otra vez:

Si desea acceder a la respuesta sin formato, debe definir su interfaz API como:

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

en lugar de:

Observable<MyResponseObject> apiCall(@Body body);

Puedes obtener la url usando:

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

aquí:
response es la respuesta de Retrofit
raw es la respuesta de OkHttp
request es la Solicitud de OkHttp que contiene la Url como HttpUrl .

Estoy tratando de actualizar a Retrofit 2.0 y agregar RxJava en mi proyecto de Android. Estoy haciendo una llamada api y quiero recuperar la url y con los datos de respuesta en sqlite como caché

Observable<MyResponseObject> apiCall(@Body body);

Y en la llamada RxJava:

myRetrofitObject.apiCall(body).subscribe(new Subscriber<MyResponseObject>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(MyResponseObject myResponseObject) { } });

En Retrofit 1.9, podríamos obtener la url en la devolución de llamada exitosa:

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

¿Cómo se hace esto con Retrofit 2.0 usando RxJava?


Obtenga una respuesta de la api utilizando el uso de rxjava siguiendo el código

Crear nombre de clase Api

clase pública 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(); } }

Interfaz de Creta nombre IApiCall

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

Actividad principal

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() { } });