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