2016-11-30 3 views
0

Я не пользуюсь дооснащением. Я должен сделать первый звонок, чтобы получить файл 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; 
    } 
+0

Не уверен, что это лучший или самый элегантный "RXJava путь", но .... я просто в конечном итоге работает другой client.newCall (запрос). выполнить(); после первого в том же кодовом блоке. – Mike6679

+0

см. Ниже [мой ответ] (http://stackoverflow.com/a/40880933/3629732) –

+0

Возможный дубликат [Цепочка двух вызовов веб-службы с использованием RxJava и дооснащения] (http://stackoverflow.com/questions/33736775/ Chaining-две веб-сервис-звонки-используя-rxjava-и-дооснащения) –

ответ

0

Смотрите код RxJava Way

//Create your customized OkHttpClient 
    final 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(); 


    Observable<AuthResponse> authObservable = Observable.fromCallable(new Func0<AuthResponse>() { 
     @Override 
     public AuthResponse call() { 
      return doOkHttpAuthOperation(client);//You can do with your auth cookie and Login Credentials 
     } 
    }); 

    Observable<NormalResponse> normalObservable = authObservable.map(new Func1<AuthResponse, NormalResponse>() { 
     @Override 
     public NormalResponse call(AuthResponse authResponse) { 
      return doOkHttpNormalOperation(client);//Normal API call 
     } 
    }); 


    Subscription subscription = normalObservable.subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Subscriber<NormalResponse>() { 
       @Override 
       public void onCompleted() { 

       } 

       @Override 
       public void onError(Throwable e) { 
        //if Any Error occurred 
       } 

       @Override 
       public void onNext(NormalResponse normalResponse) { 
        //Authenticated Response 
       } 
      }); 
Смежные вопросы