Как получить URL запроса в модификации 2.0 с помощью rxjava?
Я пытаюсь перейти на Retrofit 2.0 и добавить RxJava в мой проект Android. Я делаю вызов 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
}
Как вы это делаете с помощью Retrofit 2.0 с помощью RxJava?
Ответы
Ответ 1
Update:
После повторного чтения вопроса:
Если вам нужен доступ к необработанному ответу, вам необходимо определить свой интерфейс 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
.
Ответ 2
Получить ответ от 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() {
}
});