2011-10-11 4 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; 
} 

Cette méthode n'est pas correcte. Ce que j'essaie de comprendre est un moyen de savoir sans doute ce que les cookies vont exister, être capable de gérer les changements de cookies ainsi que de maintenir les sessions.comment gérer les cookies variables et les sessions avec jsoup?

J'écris une application pour mon forum de machines simples, et il change sa config cookie que vous cliquez pour un comportement personnalisé.

Mais si l'application se porte bien sur mon site, j'allais publier une version que d'autres pourraient utiliser pour d'autres forums.

Je sais que je suis dans la bonne direction, mais la logique est en quelque sorte de donner un coup de pied à mes fesses.

Un conseil serait grandement apprécié.

+0

En plus des commentaires de BalusC, il est peu probable que La chose 'p! = path' est ce que vous voulez vraiment dire, bien que ce soit * possible *. –

Répondre

12

Ce code est très déroutant. Le flux est illogique et la gestion des exceptions est mauvaise. Les comparaisons de référence d'objet comme if (p != path) et if (cookys != cookies) n'ont aucun sens. Pour comparer le contenu de l'objet, vous devez utiliser la méthode equals() à la place. Pour le moment, je comprends que vous voulez conserver les cookies dans un tas de requêtes Jsoup ultérieures sur le même domaine. Dans ce cas, vous devez essentiellement coller le flux suivant:

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. 

Cela peut être refactorisé la méthode suivante:

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(); 
} 

qui peut être utilisé comme

YourJsoupWrapper jsoupWrapper = new YourJsoupWrapper(); 

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

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

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

Notez que le prochain Jsoup 1.6.2 viendra avec une nouvelle méthode Connection#cookies(Map) qui devrait faire cette boucle for à chaque fois superflu.

+0

je vous remercie beaucoup. J'ai cherché et cherché un exemple de la bonne façon de le faire. De cette façon, c'est vraiment mieux que la façon dont je tentais. lol – texasman1979

+0

Quelqu'un du futur! pour une raison quelconque, j'ai trouvé JSoup très pratique. Juste mes deux cents sont que dans la bibliothèque JSoup actuelle il y a une méthode nommée cookies (carte cookies) qui fait l'addition des paires clé/valeur. Vous pouvez donc remplacer foreach par: connection.cookies (cookies) –

+0

vous pouvez faire connection.cookies (cookies) au lieu de la boucle for – caub

1

+1 pour

BalusC

j'ai changé un peu dans votre code et cela fonctionne pour moi, alors vous obtenez biscuits à partir du site et seulement que obtenir le document

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(); 
}