2010-01-13 8 views
34

Je souhaite porter une application python qui utilise la méthode mécanisée pour l'iPhone. Cette application doit se connecter à une page Web et utiliser le cookie du site pour accéder à d'autres pages de ce site afin d'obtenir des données.Gestion des cookies HTTP sur l'iPhone

Avec mon application python, j'utilisais la mécanisation pour la gestion automatique des cookies. Y at-il quelque chose de similaire pour l'objectif C qui est portable sur l'iPhone?

Merci pour toute aide.

+1

Une application * Python *? 'WWW :: Mechanize' est une bibliothèque Perl. –

+3

Il existe également un port python. http://www.recherche.sourceforge.net/mechanize/ – dan

Répondre

72

NSURLConnection vous donne la gestion des cookies gratuitement. De l'URL Loading System Programming Guide:

Le système de chargement d'URL envoie automatiquement les cookies stockés appropriés pour un NSURLRequest. à moins que la demande spécifie de ne pas envoyer de cookies. De même, les cookies renvoyés dans une réponse NSURL sont acceptés conformément à la politique d'acceptation des cookies en vigueur.

+4

+1 Cela devrait être la bonne réponse. –

+0

Comment puis-je vérifier si un NSURLRequest envoie des cookies? comment l'enregistrer sur la console? – trillions

+3

Voir '- [NSHTTPCookieStorage cookiesForURL:]'. –

43

Vous pouvez utiliser la classe NSURLConnection pour effectuer une requête HTTP pour vous connecter au site Web et récupérer le cookie. Pour effectuer une requête, créez simplement une instance de NSURLConnection et attribuez-lui un objet délégué.

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com/"]]; 
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; 

Ensuite, implémentez une méthode déléguée.

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{ 
    NSHTTPURLResponse *HTTPResponse = (NSHTTPURLResponse *)response; 
    NSDictionary *fields = [HTTPResponse allHeaderFields]; 
    NSString *cookie = [fields valueForKey:@"Set-Cookie"]; // It is your cookie 
} 

Conserver ou copier la chaîne de cookies. Lorsque vous souhaitez effectuer une autre requête, ajoutez-la à votre en-tête HTTP de votre instance NSURLRequest.

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com/"]]; 
[request addValue:cookie forHTTPHeaderField:@"Cookie"]; 
+26

Vous n'avez pas besoin de faire cela, NSURLConnection stocke automatiquement et envoie des cookies à moins que vous ne le disiez explicitement. – benzado

+1

Même si cela ne devrait pas être nécessaire, un bogue suspecté a été corrigé dans iOS 4.2GM –

+0

Comment détecter qu'une session a expiré côté client? Quel rappel devrions-nous nous attendre? Ou est-ce juste une question de vérifier si la requête (avec cette identification de session) a réussi ou non? – Cole

0

La réponse de @ zonble ne fonctionne que dans mon localhost; Si le serveur n'est pas exécuté localement, l'en-tête "Set-Cookie" est manquant dans les champs NSDictionary * = [HTTPResponse allHeaderFields];

Enfin, j'ai trouvé la solution @ benzado fonctionne très bien. Voir aussi: iphone nsurlconnection read cookies La réponse de @Tal Bereznitskey.