Установите файлы cookie с помощью NSURLSession

Привет, я разрабатываю одно приложение для iPhone, в котором я хочу установить файлы cookie после ответа сервера и использовать его для другого запроса. Мой сетевой запрос выглядит так.

NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
    NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;
    NSLog(@"sttaus code %i", httpResp.statusCode);
    if (error) {
        [self.delegate signinWithError:error];
    }
    else {
        [self.delegate signinWithJson:data];
    }
}] resume];

Но я не знаю, как установить куки. Я знаю, что должен использовать NSHTTPCookieStorage, но не знаю, как его установить. И я также хочу использовать эти файлы cookie для другого запроса. Есть ли кто-нибудь, кто знает об этом? Нужна помощь. Спасибо.

Смотрите, я пытался таким образом

NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{      
    if(error) {
        [self.delegate signinWithError:error];
    }
    else {
        NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;

        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];
        NSHTTPCookie *cookie;

        NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];

        NSDictionary* headers = [(NSHTTPURLResponse *)response allHeaderFields];

        for(NSString *key in [headers allKeys]) {
            NSLog(@"%@ ..PPPP ... %@",key ,[headers objectForKey:key]);
            [cookieProperties setObject:[headers objectForKey:key] forKey:key];
        }

        [cookieProperties setObject:[[NSDate date] dateByAddingTimeInterval:2629743] forKey:NSHTTPCookieExpires];

        cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
        [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];

        [self.delegate signinWithJson:data];
    }
}] resume];

Меня интересует только одно поле заголовка Set-Cookie SSID=kgu62c0fops35n6qbf12anqlo7; path=/


person nilkash    schedule 22.04.2014    source источник


Ответы (2)


Возможно, вам сойдет с рук просто использование sharedHTTPCookieStorage для NSHTTPCookieStorage, а затем используйте setCookies:forURL:mainDocumentURL: или один setCookie: - последний может быть лучше для ваших нужд .

Если это не работает, вам может потребоваться настроить NSURLSessionConfiguration и задайте NSHTTPCookieStorage

В документах это не указано, но defaultSessionConfiguration в любом случае может использовать общее хранилище.

NSURLSession *session = [NSURLSession sharedSession];
[[session dataTaskWithURL:url completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
    NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response;

    NSArray *cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:[response URL]];
    [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookies:cookies forURL:[response URL] mainDocumentURL:nil];

    NSLog(@"sttaus code %i", httpResp.statusCode);
    if (error) {
        [self.delegate signinWithError:error];
    }
    else {
        [self.delegate signinWithJson:data];
    }
}] resume];
person Rich    schedule 22.04.2014
comment
У меня есть поля заголовка после запроса на вход. Итак, у меня есть два способа сделать это: добавить идентификатор сеанса (или обязательные поля) в данные пользователя или сохранить его в виде файлов cookie. Решил куки использовать. Но я не знаю, как создавать и передавать файлы cookie с помощью NSURLSESSION. - person nilkash; 22.04.2014
comment
Не могли бы вы опубликовать поля заголовка, пожалуйста, не стесняйтесь удалять важные данные - person Rich; 22.04.2014
comment
У вас есть куки в ответе - я думал, вы хотели установить его по запросу - person Rich; 22.04.2014
comment
:). См. это полный сценарий. Пользователь войдет в мое приложение. после входа в систему я должен поддерживать сеанс для этого пользователя. Итак, что я делаю после того, как пользователь вошел в систему, я сохраняю идентификатор сеанса на некоторое время. Поэтому, если пользователь выполняет какие-либо действия в моем приложении, мне нужен этот идентификатор сеанса. В противном случае сервер выдает ошибку 401. Поэтому после входа в систему для любого запроса я передаю этот идентификатор сеанса для аутентификации на стороне сервера. Это правильный путь или есть лучший способ. С удовольствием приму лучший :) - person nilkash; 22.04.2014
comment
Ну вот, попробуйте это - если это не сработает, вам может понадобиться использовать пользовательскую конфигурацию сеанса, дайте мне знать - person Rich; 22.04.2014
comment
Это создаст файл cookie для меня, но как я могу добавить его в другой заголовок запроса. Есть ли способ, которым мой запрос может использовать файлы cookie по умолчанию. Я думаю, что есть одна конфигурация. Я не уверена. Есть ли? В магазине файлов cookie Android есть. Есть ли что-то подобное для IOS. - person nilkash; 22.04.2014
comment
Имеют ли другие запросы тот же домен/путь, что и файл cookie? - person Rich; 22.04.2014
comment
Меня не интересует другая часть файлов cookie, меня интересует файл сеанса. Set-Cookies и его значение - person nilkash; 22.04.2014
comment
Другие части куки-файла важны — они определяют, где можно использовать куки-файл. - person Rich; 22.04.2014
comment
Ok. Но в Android я использую только идентификатор сеанса, и это работает :). Я рад отправить всю часть файлов cookie, но не знаю, как отправить с NSURLSESSION. И все запросы находятся в одном домене. - person nilkash; 22.04.2014
comment
Я уже писал, как отправлять файлы cookie с помощью NSURLSession. Даже в Android вам все равно нужно установить файлы cookie для URL-адресаjava.net.CookieStore то же самое). Опубликуйте свой код Android, а также ... - person Rich; 22.04.2014
comment
У меня нет кода Android, сейчас я опубликую его в ближайшее время. И попробую этот, дайте знать, работает или нет :) - person nilkash; 22.04.2014
comment
Любые запросы, использующие sharedSession, будут использовать общее хранилище файлов cookie, поэтому они будут получать все файлы cookie, имеющие совпадающий домен и путь. - person Rich; 22.04.2014
comment
вместо сохранения всего поля заголовка я могу сохранить только несколько значений и использовать их? - person nilkash; 22.04.2014
comment
cookiesWithResponseHeaderFields:forURL: извлекает только Set-Cookie заголовки. Вы можете пройтись по этому списку и выбрать те, которые хотите использовать, но вам еще нужно сопоставить их с URL-адресом. Если вы не хотите устанавливать какие-либо другие файлы cookie, вы можете просто установить их все - person Rich; 22.04.2014
comment
Нет простите. И я сделал это несколькими способами — используя файлы cookie, Oauth, токены сеанса, базовую аутентификацию. Этот метод должен работать для того, что вы хотите сделать. - person Rich; 22.04.2014
comment
Да, конечно. Спасибо. Проверю :) - person nilkash; 22.04.2014

Я много исследовал, но нашел один на веб-сайте на другом языке. Решение состоит в том, чтобы добавить пустой обработчик событий для начала и конца сеанса:

protected void Session_Start(object sender, EventArgs e)
{
}
protected void Session_End(object sender, EventArgs e)
{
}
person Carson    schedule 12.06.2016
comment
Я не уверен, что вы ответили здесь не на тот вопрос по ошибке или что, но этот ответ абсолютно не связан с вопросом. - person shortstuffsushi; 07.12.2016