2015-02-25 5 views
0

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

+ (NSData*)makeHTTPPostRequestToURL:(NSURL *)url withPostString:(NSString *)postString{ 

    if (!postString) 
    { 
     postString = [NSString stringWithFormat:@""]; 
    } 

    NSMutableURLRequest* urlRequest = [NSMutableURLRequest requestWithURL:url]; 

    NSString *authStr = [NSString stringWithFormat:@"genuser:genuser"]; 
    NSData *authData = [authStr dataUsingEncoding:NSASCIIStringEncoding]; 
    NSString *authValue = [NSString stringWithFormat:@"Basic %@", [authData base64EncodedStringWithOptions:0]]; 
    [urlRequest setHTTPMethod:@"POST"]; 
    [urlRequest setValue:authValue forHTTPHeaderField:@"Authorization"]; 
    [urlRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
    [urlRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
    [urlRequest setValue:[NSString stringWithFormat:@"%lu", (unsigned long)postString.length] forHTTPHeaderField:@"Content-Length"]; 
    postString =[self specialencoding:NSUTF8StringEncoding :postString ]; 

    NSLog(@"Request log is %@", postString); 

    [urlRequest setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]]; 
    NSLog(@"POST:ESCAPED:%@",postString); 
    NSHTTPURLResponse* urlResponse = nil; 
    NSError* error = nil; 

    NSData* responseData = [NSURLConnection sendSynchronousRequest:urlRequest returningResponse:&urlResponse error:&error]; 

    return responseData; 
} 

Как вы можете видеть, я не использую cookie, когда я делаю запрос в том же сеансе. Все запросы работают нормально. Мое сомнение заключается в том, как запрос подается в тот же сеанс, если он не отправляет куки-файл с ним. IOS сохраняет последний полученный файл cookie для каждого приложения и добавляет его с дальнейшими запросами приложения. Какие-нибудь идеи?

ответ

2

Так что происходит, так это то, что файлы cookie, отправленные обратно, хранятся в объекте NSHTTPCookieStorage. Всякий раз, когда запросы отправляются обратно на URL-адрес, соответствующий домену cookie и пути, cookie отправляется вместе с запросом автоматически.

Чтобы проверить, что куки есть для определенного домена:

let url = NSURL(string: "https://yourcookiedomain.com")!; 
let cookieStorage = NSHTTPCookieStorage.sharedHTTPCookieStorage(); 
let cookies = cookieStorage.cookiesForURL(url) as Array<NSHTTPCookie>; 

var cookie: NSHTTPCookie? = nil; 
for c in cookies { 
    if (c.name == "cookie_name") { 
     cookie = c; 
     break; 
    } 
} 
+0

Привет @thatidiotguy Спасибо за ответ на мой вопрос. Если я запрашиваю сервер для нового сеанса (в случае таймаута сеанса), снова отправляя учетные данные, будет ли старый файл cookie заменен новым для последующих запросов? – chaithu

+0

@chaithu Я не знаю, почему бы вам не попробовать? Я отправлю код для извлечения файлов cookie в хранилище. Дай мне минуту. – thatidiotguy