2017-08-09 24 views
1

如何在另一次使用OkHTTP3之後發送請求? 我必須這樣: 1)我發送請求1使用方法OkHTTPRequest,到服務器2)服務器發送響應與COOKIE請求1 3)我保存這個餅乾4)我發送請求2保存餅乾。如何在OkHTTP3中發送另一個請求後?

我在步驟4有問題。 看起來request2在request1之後發送,在request1保存他的cookies之前。 如何解決它? 我希望在請求保存自己的cookie後立即發送reuest2。

@Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
     mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 
     progressBar = (ProgressBar) findViewById(R.id.progress_bar); 

     try 
     { 
      // Получаем cookie и авторизируемся 
      Log.d("TAG", "Вызываем OkHTTPRequest1"); 
      OkHTTPRequest(postUrl, "POST", postData1); 
      Log.d("TAG", "Вызываем OkHTTPRequest2"); 
      OkHTTPRequest(postUrl2, "PUT", postData2); 

      int a; 
     } catch (IOException e) 
     { 
      e.printStackTrace(); 
     } catch (JSONException e) 
     { 
      e.printStackTrace(); 
     } 

    } 

    // Сохраняем cookieFromServer 
    public void saveCookie(List<Cookie> cookies) 
    { 
     for (int i = 0; i < cookies.size(); i++) 
     { 
      String str = cookies.get(i).toString(); 
      if (str.indexOf("issa7=") != -1) 
      { 
       cookieFromServer.add(cookies.get(i)); 
       Log.d("TAG", "Сохраняем cookie в глобальную переменную ="+ cookies.get(i).toString()); 
      } 
     } 
    } 

    // Создаем клиент OkHTTPRequest и обрабатываем запросы 
    void OkHTTPRequest(String postUrl, String requestMethodType, String postData) throws IOException, JSONException 
    { 
     // Создаем клиент OkHTTPRequest 
     OkHttpClient client = new OkHttpClient() 
       .newBuilder() 
       // Переопределяем методы чтобы можно было сохранять и применять ccokie в запросах 
       .cookieJar(new CookieJar() 
       { 
        @Override 
        public void saveFromResponse(HttpUrl url, List<Cookie> cookies) 
        { 
         saveCookie(cookies); 
         Log.d("TAG", "Вызываем saveCookie "); 
        } 

        @Override 
        public List<Cookie> loadForRequest(HttpUrl url) 
        { 
         Log.d("TAG","Читаем cookie"); 
         return cookieFromServer; 
        } 
       }) 
       .build(); 

     Log.d("TAG","Создаем OkHttpClient клиента " + client.toString()); 

     MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded"); 
     RequestBody body = RequestBody.create(mediaType, postData); 
     Request request = new Request.Builder() 
       .url(postUrl) 
       .method(requestMethodType, body) 
       .addHeader("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4") 
       .addHeader("Cache-Control", "max-age=0") 
       .addHeader("Connection", "keep-alive") 
       .addHeader("User-Agent", "Mango Mobile Android") 
       .build(); 

     client.newCall(request).enqueue(new Callback() 
     { 
      @Override 
      public void onFailure(Call call, IOException e) 
      { 
       call.cancel(); 
      } 

      @Override 
      public void onResponse(Call call, Response response) throws IOException 
      { 
       // Получать response.body().string() можно только один раз. Иначе будет ошибка так реализованно. 
       String html = response.body().string(); 
       //Log.d("TAG", "Код сайта "+ html); 
       Document doc = Jsoup.parse(html); 
       // Копируем содержание response.body() 
       setDoc(doc); 
       parseResult(bids); 
       // Чтобы обращаться к компанентам из MainActivity нужно использовать runOnUiThread 
       MainActivity.this.runOnUiThread(new Runnable() 
       { 
        @Override 
        public void run() 
        { 
         // Отключаем progressBar 
         progressBar.setVisibility(View.GONE); 
         // Устанавливаем адаптер 
         adapter = new MyRecyclerViewAdapter(MainActivity.this, feedsList); 
         mRecyclerView.setAdapter(adapter); 
        } 
       }); 


      } 
     }); 
    } 

    // Сохраняем Document код страницы 
    void setDoc(Document doc) 
    { 
     this.doc = doc; 
     // Получаем список БИДОВ 
     Log.d("TAD", "Получаем список БИДОВ"); 
     Elements tmpBids = doc.select("a.go-product[href$=\"vats\"]"); 

     for (int i = 0; i < tmpBids.size(); i++) 
     { 
      bids.add(tmpBids.get(i).attr("href")); 
      //Log.d("TAD", bids.get(i).toString()); 
     } 
    } 


    private void parseResult(List<String> bids) 
    { 
     // Формируем данные feedsList для адаптера 
     Log.d("TAD", "Формируем данные feedsList для адаптера"); 
     feedsList = new ArrayList<>(); 
     for (int i = 0; i < bids.size(); i++) 
     { 
      FeedItem item = new FeedItem(); 
      item.setTitle(bids.get(i)); 
      item.setThumbnail("thumbnail"); 
      feedsList.add(item); 
     } 
    } 
} 
+0

Checkout RxJava它有Observable使用它可以使請求鏈 –

回答

0

檢查Retrofit。這是一個非常棒的Android和Java REST客戶端,建立在OkHttp之上。它使與RxJava合作愉快。

這裏是一個有用的職位,可以給你helpful post

1

有怎樣鏈改造和RxJava您的要求是你的代碼的幾個問題多一點背景。

  1. 方法名稱應該是小寫(文體)OkHTTPRequest(...)起初有點混亂。
  2. 您正在異步觸發HTTP請求,您可以通過調用client.newCall(request).execute()來強制HTTP客戶端阻止,我相信或者像其他人建議的那樣,使用類似RxJava的庫來處理鏈接異步命令。
  3. OkHttpClient旨在重複使用多個請求,尤其是在使用cookie罐時。理想情況下,您只有OkHttpClient的一個實例並將其用於多個請求。你的餅乾罐似乎可能會工作,但只是因爲你使用全局列表來存儲餅乾,這可能是一個不好的做法。

如果您可以添加okhttp3.JavaNetCookieJar依賴項,您可以使用以下代碼獲得一個可用的工作cookie jar。

import okhttp3.JavaNetCookieJar; 

CookieManager cookieManager = new CookieManager(); 
cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL); 
JavaNetCookieJar cookieJar = new JavaNetCookieJar(cookieManager); 

OkHttpClient client = new OkHttpClient.Builder().cookieJar(cookieJar).build(); 

此外,任何時候您有OkHttp麻煩調試其漂亮設立OkHttp Logging Interceptor

HttpLoggingInterceptor logging = 
    new HttpLoggingInterceptor((msg) -> { 
     Log.d(msg); 
    }); 
logging.setLevel(Level.BODY); 

client.addNetworkInterceptor(logging); 
相關問題