Сохранение cookie на iPhone после входа в систему через HTTP POST - смешивание C ++ и Objective C - PullRequest
2 голосов
/ 14 октября 2010

Я работал с openFrameworks, над проблемой, которая размещена на форуме: www.openframeworks.cc/forum/viewtopic.php?f=8&t=4765

По сути, я использовал набор файлов ofxHttpUtils, который использует poco для публикации в веб-формах. Пример кода, который я использовал, находится по адресу: github.com/arturoc/ofxHttpUtils/blob/gh-pages/example/src/testApp.cpp

Я хочу отправить POST на страницу входа, имя пользователя и пароль, а затем я собираюсь стереть текст ответа ... это цель с помощью приложения для iPhone.

У меня проблема с печеньем. В надстройке ofxHttpUtils нет метода запоминания файла cookie из сообщения POST, поэтому ответ, который я получаю, - это просто страница входа. Я искал методы, чтобы попытаться перехватить cookie, и, похоже, что-то здесь есть в Objective C, от другого поста до переполнения стека:

NSHTTPURLResponse   * response;
NSError             * error;
NSMutableURLRequest * request;
request = [[[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://temp/gomh/authenticate.py?setCookie=1"]
                                        cachePolicy:NSURLRequestReloadIgnoringCacheData 
                                    timeoutInterval:60] autorelease];

[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];    
NSLog(@"RESPONSE HEADERS: \n%@", [response allHeaderFields]);

// If you want to get all of the cookies:
NSArray * all = [NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:[NSURL URLWithString:@"http://temp"]];
NSLog(@"How many Cookies: %d", all.count);
// Store the cookies:
// NSHTTPCookieStorage is a Singleton.
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookies:all forURL:[NSURL URLWithString:@"http://temp"] mainDocumentURL:nil];

// Now we can print all of the cookies we have:
for (NSHTTPCookie *cookie in all)
    NSLog(@"Name: %@ : Value: %@, Expires: %@", cookie.name, cookie.value, cookie.expiresDate); 


// Now lets go back the other way.  We want the server to know we have some cookies available:
// this availableCookies array is going to be the same as the 'all' array above.  We could 
// have just used the 'all' array, but this shows you how to get the cookies back from the singleton.
NSArray * availableCookies = [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookiesForURL:[NSURL URLWithString:@"http://temp"]];
NSDictionary * headers = [NSHTTPCookie requestHeaderFieldsWithCookies:availableCookies];

// we are just recycling the original request
[request setAllHTTPHeaderFields:headers];

request.URL = [NSURL URLWithString:@"http://temp/gomh/authenticate.py"];
error       = nil;
response    = nil;

NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSLog(@"The server saw:\n%@", [[[NSString alloc] initWithData:data encoding: NSASCIIStringEncoding] autorelease]);

Я не уверен, как / где это реализовать, чтобы я мог интегрироваться с моим кодом ofxHttpUtils, чтобы куки запоминались и передавались при вызовах на сайт, защищенный паролем. Кто-нибудь может помочь? Я знаю, что этот запрос немного не конкретен ... Надеюсь, вы понимаете, что я пытаюсь сделать ...

1 Ответ

0 голосов
/ 14 октября 2010

Поскольку вы уже используете OF, вероятно, будет проще придерживаться этого.Вам придется расширить xHttpUtils для обработки файлов cookie, либо сделав их более интеллектуальными, чтобы интеллектуально обрабатывать файлы cookie, либо оставив их немыми, позволяя вам захватывать и устанавливать файлы cookie по мере необходимости.Poco :: Net, на котором основан xxttpUtils, не имеет проблем с cookie-файлами - он включает в себя такие функции, как HTTPResponse::getCookies().

Самый простой подход - тупой:

  • добавьте ofxHttpForm::setCookies(), чтобы вы могли передавать куки в модуль, и getCookies(), чтобы модуль мог получить к ним доступ
  • изменить ofxHttpUtils::doPostForm(), чтобы извлечь куки из ofxHttpForm и установить их наPoco HTTPRequest
  • измените конструктор ofxHttpRequest так, чтобы он извлекал файлы cookie из Poco HTTPResponse и предоставил способ для вашего кода получить их

Тогда ваш код будетзахватите файлы cookie, отправленные после входа в систему POST, и установите их для всех будущих запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...