10

私は非常に奇妙な問題を抱えています。URL を要求していて、そこから Cookie を取得したいのですが、この方法を使用して Cookie を取得しました。

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

しかし、Cookie は完全ではありません。一部のフィールドが欠落しています。PostMan で確認しましたが、すべての Cookie が存在します。

を開始するときにもこの方法を使用しましたNSURLRequest

[request setHTTPShouldHandleCookies:YES];

問題はどこだ?

注: この問題は iOS にあります。私は Android バージョンを使用していますが、問題なく動作しており、すべての Cookie がそこにあります。

4

5 に答える 5

15

次のコードサンプルを試しましたか?動作するはずです:

- (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
}
于 2013-09-28T11:57:25.190 に答える
13

@biloshkurskyi.ssの答えは的を射ています。

一部の Cookie が iOS の response.allHeaderFields に表示されない理由を調べるのに半日を費やしましたが、Android には (同じサービスを使用して) ありました。

その理由は、一部の Cookie が事前に抽出され、共有 Cookie ストアに保存されるためです。allHeaderFields には表示されません。

誰かがそれを必要とする場合の答えの迅速な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()
于 2016-10-24T22:02:02.333 に答える
10

このコードを試してください:

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]);
}
于 2013-11-27T21:29:42.383 に答える