2011-10-11 30 views
5
public boolean isGood(String path) 
{ 
    if (p != path) 
    { 
     good = false; 
    } 

    if (good) 
    { 
     try 
     { 
      Connection connection = Jsoup.connect(path); 
      Map<String, String> cookys = Jsoup.connect(path).response().cookies(); 

      if (cookys != cookies) 
       cookies = cookys; 

      for (Entry<String, String> cookie : cookies.entrySet()) 
      { 
       connection.cookie(cookie.getKey(), cookie.getValue()); 
      } 

      Doc = connection.get(); 
      good = true; 
     } 
     catch (Exception e) 
     { 
      rstring = e.getMessage().toString(); 
      good = false; 
     } 
    } 
    else 
    { 
     try 
     { 
      Response response = Jsoup.connect(path).execute(); 
      cookies = response.cookies(); 
      Doc = response.parse(); 
      good = true; 
     } 
     catch (Exception e) 
     { 
      rstring = e.getMessage().toString(); 
      good = false; 
     } 
    }  
    return good; 
} 

Phương pháp này không đúng. Những gì tôi đang cố gắng tìm ra là một cách để không biết cookie nào sẽ tồn tại, có thể xử lý các thay đổi cookie cũng như duy trì các phiên.cách duy trì cookie và phiên biến với jsoup?

Tôi đang viết một ứng dụng cho diễn đàn máy đơn giản của mình và nó thay đổi cấu hình cookie khi bạn nhấp vào xung quanh cho một số hành vi tùy chỉnh.

Nhưng nếu ứng dụng hoạt động tốt cho trang web của tôi, tôi sẽ xuất bản phiên bản cho người khác sử dụng cho các diễn đàn khác.

Tôi biết tôi đang đi đúng hướng, nhưng logic là loại đá mông của tôi.

Mọi lời khuyên sẽ được đánh giá cao.

+0

Ngoài các ý kiến ​​BalusC, nó không chắc rằng 'p! = path' là điều bạn thực sự muốn nói, mặc dù nó có thể *. –

Trả lời

12

Mã này rất khó hiểu. Dòng chảy là phi logic và xử lý ngoại lệ là xấu. So sánh tham chiếu đối tượng như if (p != path)if (cookys != cookies) không có ý nghĩa hoàn toàn. Để so sánh nội dung của đối tượng, bạn cần sử dụng phương thức equals().

Đến thời điểm này, tôi hiểu rằng bạn muốn duy trì cookie trong một loạt các yêu cầu Jsoup tiếp theo trên cùng một tên miền. Trong trường hợp đó, bạn cần phải cơ bản tuân thủ các dòng sau đây:

Map<String, String> cookies = new HashMap<String, String>(); 

// First request. 
Connection connection1 = Jsoup.connect(url1); 
for (Entry<String, String> cookie : cookies.entrySet()) { 
    connection1.cookie(cookie.getKey(), cookie.getValue()); 
} 
Response response1 = connection1.execute(); 
cookies.putAll(response1.cookies()); 
Document document1 = response1.parse(); 
// ... 

// Second request. 
Connection connection2 = Jsoup.connect(url2); 
for (Entry<String, String> cookie : cookies.entrySet()) { 
    connection2.cookie(cookie.getKey(), cookie.getValue()); 
} 
Response response2 = connection2.execute(); 
cookies.putAll(response2.cookies()); 
Document document2 = response2.parse(); 
// ... 

// Third request. 
Connection connection3 = Jsoup.connect(url3); 
for (Entry<String, String> cookie : cookies.entrySet()) { 
    connection3.cookie(cookie.getKey(), cookie.getValue()); 
} 
Response response3 = connection3.execute(); 
cookies.putAll(response3.cookies()); 
Document document3 = response3.parse(); 
// ... 

// Etc. 

này có thể được refactored đến phương pháp sau đây:

private Map<String, String> cookies = new HashMap<String, String>(); 

public Document get(url) throws IOException { 
    Connection connection = Jsoup.connect(url); 
    for (Entry<String, String> cookie : cookies.entrySet()) { 
     connection.cookie(cookie.getKey(), cookie.getValue()); 
    } 
    Response response = connection.execute(); 
    cookies.putAll(response.cookies()); 
    return response.parse(); 
} 

mà có thể được sử dụng như

YourJsoupWrapper jsoupWrapper = new YourJsoupWrapper(); 

Document document1 = jsoupWrapper.get(url1); 
// ... 

Document document2 = jsoupWrapper.get(url2); 
// ... 

Document document3 = jsoupWrapper.get(url3); 
// ... 

Lưu ý rằng Jsoup 1.6.2 sắp tới sẽ đi kèm với phương thức Connection#cookies(Map) mới sẽ làm cho vòng lặp đó for mỗi lần thừa.

+0

tôi cảm ơn bạn rất nhiều. tôi đã tìm kiếm và tìm kiếm một ví dụ về đúng cách để làm điều đó. cách này chắc chắn là tốt hơn so với cách tôi đã cố gắng. lol – texasman1979

+0

Ai đó trong tương lai! vì một số lý do tôi thấy JSoup rất tiện lợi. Chỉ hai xu của tôi là trong thư viện JSoup hiện tại, có một phương thức có tên là cookie (Bản đồ cookie) mà bổ sung các cặp khóa/giá trị. Vì vậy, foreach trên có thể được thay thế cho: connection.cookies (cookie) –

+0

bạn có thể thực hiện connection.cookies (cookie) thay vì vòng lặp – caub

1

1 cho BalusC

tôi đã thay đổi một số trong mã của bạn và nó làm việc cho tôi, vì vậy bạn sẽ có được cookie từ trang web và chỉ hơn có được tài liệu

public Document get(String url) throws IOException { 
    Connection connection = Jsoup.connect(url).userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); 
    Connection.Response response = connection.execute(); 
    connection.cookies(response.cookies()); 
    return connection.get(); 
} 
Các vấn đề liên quan