2017-08-09 98 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); 
相关问题