Я не пользуюсь дооснащением. Я должен сделать первый звонок, чтобы получить файл cookie, но мне нужно сделать второй вызов с тем же клиентом OkHttclient (фактически я предполагаю, что мне нужен тот же клиент из-за файла cookie auth). Поэтому, когда первый HTTP-вызов завершен, мне нужно сделать другой вызов другого URL-адреса, используя одну и ту же клиентскую переменную. Как я могу достичь этого чисто?Android: RxJava с OkHttp: Как сделать второй звонок, который зависит от первого?
Я думал, что могу использовать .concatWith (см. Код ниже), но я не уверен, правильно ли это, поскольку я не мог найти твердых примеров.
Subscription subscription = Observable.create(new Observable.OnSubscribe<Response>() {
OkHttpClient client = new OkHttpClient.Builder()
.cookieJar(new CookieJar() {
private final HashMap<HttpUrl, List<Cookie>> cookieStore = new HashMap<>();
@Override
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
cookieStore.put(url, cookies);
}
@Override
public List<Cookie> loadForRequest(HttpUrl url) {
List<Cookie> cookies = cookieStore.get(url);
return cookies != null ? cookies : new ArrayList<Cookie>();
}
})
.build();
@Override
public void call(Subscriber<? super Response> subscriber) {
try {
HttpUrl.Builder urlBuilder = HttpUrl.parse(AUTHTOKEN_URL).newBuilder();
urlBuilder.addQueryParameter("username", AUTHTOKEN_USERNAME);
urlBuilder.addQueryParameter("password", AUTHTOKEN_PASSWORD);
String url = urlBuilder.build().toString();
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
subscriber.onNext(response);
subscriber.onCompleted();
if (!response.isSuccessful()){
subscriber.onError(new Exception("error"));
}
}
catch (IOException e) {
subscriber.onError(e);
}
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.concatWith(
//what code goes here??
)
.subscribe(new Subscriber<Response>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Response response) {
}
});
return subscription;
}
Не уверен, что это лучший или самый элегантный "RXJava путь", но .... я просто в конечном итоге работает другой client.newCall (запрос). выполнить(); после первого в том же кодовом блоке. – Mike6679
см. Ниже [мой ответ] (http://stackoverflow.com/a/40880933/3629732) –
Возможный дубликат [Цепочка двух вызовов веб-службы с использованием RxJava и дооснащения] (http://stackoverflow.com/questions/33736775/ Chaining-две веб-сервис-звонки-используя-rxjava-и-дооснащения) –