先月はSwiftをやっていましたが,今月はObjective-Cです.
数年ぶりに他人が書いたObjective-CでAFNetworkingライブラリを使用した通信処理を読んでいて,Cookieを扱う処理がわからず困ったのでメモしておきます.
▼ AFNetwork でリクエストにCookieを設定する
リクエスト ヘッダにクッキーを設定するには以下のように記述します.
NSString *cookie = [NSString stringWithFormat: @"(Cookieのキー名)=%@; path=/; HttpOnly", (設定する値)]; [manager.requestSerializer setValue: cookie forHTTPHeaderField: @"Cookie"]; |
▼ リクエスト ヘッダを参照する
正しくリクエスト ヘッダにクッキーが設定されているかは,デバッグウィンドウで以下のように参照できます.
(lldb) po manager.requestSerializer.HTTPRequestHeaders |
▼ レスポンス ヘッダを参照する
レスポンス ヘッダを参照するには以下のようにレスポンスを受信時に参照できます.
コード省略 : success:^(NSURLSessionTask *operation, id responseObject){ NSHTTPURLResponse *response = (NSHTTPURLResponse *)[operation response]; (lldb) po response.allHeaderFields |
▼ レスポンス ヘッダで参照できなかったCookieをCookieストレージで参照する
今回少し困ったことに以下のようにしてもレスポンス ヘッダで参照できるクッキーが参照できなかったので、記事を参考にCookieストレージから参照することで対処しました.
NSString *cookie = httpUrlResponse.allHeaderFields[@"Set-Cookie"]; |
スタックオーバーフローに参考になる記事がありましたので,メモしておきます.
以下,参考になると思われる部分を抜粋です.
1) Upon successful authentication, the webservice hands me two cookies. How do I access them? Do I go straight to NSHTTPCookie storage and grab the cookie by its name, or is there an AFNetworking "way" to do this? AFNetworking doesn't do anything explicitly with cookies so there is no "AFNetworking way" of dealing with cookies. You'll work with NSHTTPCookie and NSHTTPCookieStorage. 【Google翻訳】 1)認証に成功すると、Webサービスは2つのCookieを渡します。それらにアクセスするにはどうすればよいですか? NSHTTPCookieストレージに直接移動して、名前でCookieを取得しますか、それともAFNetworkingの「方法」がありますか? AFNetworkingはCookieを明示的に処理しないため、Cookieを処理する「AFNetworkingの方法」はありません。 NSHTTPCookieとNSHTTPCookieStorageを使用します。
NSURLSessionでCookieを扱うサンプルは以下が参考になります.
(参考)iOS7:NSURLSessionのhttp(cookie)でハマった
Objective-Cで書かれた通信処理のサンプルを探していて困ったのは,以下のクラスの関係です.
それぞれバージョンアップで改変されたクラスであると理解して情報を参照した方が理解しやすいと思います.
AFHTTPOperationManager → AFHTTPSessionManager NSURLSession → NSURLConnectionFollow @redwing1300