Получить куки от NSHTTPURLResponse
У меня очень странная проблема, я запрашиваю URL-адрес и хочу получить от него файлы cookie. Я использовал этот способ для получения файлов cookie:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSHTTPURLResponse *HTTPResponse = (NSHTTPURLResponse *)response;
NSDictionary *fields = [HTTPResponse allHeaderFields];
NSString *cookie = [fields valueForKey:"Set-Cookie"];
}
НО куки не заполнены, некоторые поля отсутствуют, я проверил их на PostMan, все куки есть.
Я использовал также этот метод при запуске NSURLRequest
,
[request setHTTPShouldHandleCookies:YES];
В чем проблема?
ПРИМЕЧАНИЕ: эта проблема на iOS, у меня есть версия для Android, и она работает нормально, и все куки есть.
4 ответа
@biloshkurskyi.ss ответ на месте.
Я потратил полдня, пытаясь выяснить, почему некоторые из моих cookie-файлов не появились в моем response.allHeaderFields на iOS, но они были там на Android (используя тот же сервис).
Причина в том, что некоторые файлы cookie извлекаются заранее и хранятся в общем хранилище файлов cookie. Они не появятся во всех заголовочных полях.
Вот быстрый вариант ответа 3, если кому-то это нужно:
let request = URLRequest(url: myWebServiceUrl)
let session = URLSession.shared
let task = session.dataTask(with: request, completionHandler: {
(data, response, error) in
if let error = error {
print("ERROR: \(error)")
} else {
print("RESPONSE: \(response)")
if let data = data, let dataString = String(data: data, encoding: .utf8) {
print("DATA: " + dataString)
}
for cookie in HTTPCookieStorage.shared.cookies! {
print("EXTRACTED COOKIE: \(cookie)") //find your cookie here instead of httpUrlResponse.allHeaderFields
}
}
})
task.resume()
Вы пробовали следующий пример кода, он должен работать:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSArray *cookies =[[NSArray alloc]init];
cookies = [NSHTTPCookie
cookiesWithResponseHeaderFields:[response allHeaderFields]
forURL:[NSURL URLWithString:@""]]; // send to URL, return NSArray
}
Попробуйте этот код:
for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies])
{
NSLog(@"name: '%@'\n", [cookie name]);
NSLog(@"value: '%@'\n", [cookie value]);
NSLog(@"domain: '%@'\n", [cookie domain]);
NSLog(@"path: '%@'\n", [cookie path]);
}
for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies])
{
NSLog(@"name: '%@'\n", [cookie name]);
NSLog(@"value: '%@'\n", [cookie value]);
NSLog(@"domain: '%@'\n", [cookie domain]);
NSLog(@"path: '%@'\n", [cookie path]);
}
Второй код:
NSHTTPURLResponse *HTTPResponsesss = (NSHTTPURLResponse *)response;
NSDictionary *fields = [HTTPResponsesss allHeaderFields];
NSString *cookie = [fields valueForKey:@"Set-Cookie"]; // It is your cookie
NSLog (@ "% @", cookie);
Оба кода работают нормально.
Это сработает.
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSString *cookieValue = @"";
NSString *cookieHeaderValue = @"";
NSString *finalCookieValue = @"";
for (NSHTTPCookie *each in cookieStorage.cookies) {
if ([each.name isEqualToString:@"ASP.NET_SessionId"]) {
cookieHeaderValue = [cookieHeaderValue stringByAppendingString:each.name];
cookieHeaderValue = [cookieHeaderValue stringByAppendingString:@"="];
cookieHeaderValue = [cookieHeaderValue stringByAppendingString:each.value];
cookieHeaderValue = [cookieHeaderValue stringByAppendingString:@";"];
} else {
cookieValue = [cookieValue stringByAppendingString:each.name];
cookieValue = [cookieValue stringByAppendingString:@"="];
cookieValue = [cookieValue stringByAppendingString:each.value];
cookieValue = [cookieValue stringByAppendingString:@";"];
}
}
finalCookieValue = [NSString stringWithFormat:@"%@%@", cookieHeaderValue, cookieValue];