私はAFNetworking 2.0を使い始めたばかりで、HTTP Getリクエストにヘッダーをどのように入れるのか疑問に思っていました。ドキュメントは、次のようなGETをセットアップします。
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"foo": @"bar"};
[manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
しかし、NSURLRequests
を処理していないため、HTTPヘッダーの設定方法がわかりません。
任意の助けをいただければ幸いです。
よろしく、
マイク
AFNetworking 2.0の素晴らしいドキュメントでは、これを見つけるのが少し難しくなりますが、それはあります。 AFHTTPRequestSerializer
には -setValue:forHTTPHeaderField:
があります。
または、AFHTTPSessionManager
から派生するセッションマネージャーを作成する推奨アプローチに従っている場合、そのクラスはメソッドをオーバーライドして、各リクエストのヘッダーを変更することができます -dataTaskWithRequest:completionHandler:
。私はこれを使用してリクエストを検査し、ヘッダーをケースバイケースで変更し、そのマネージャーに含まれるネットワークの責任を保持するため、シリアライザーを変更することを好みます(そしてシングルトンをいじるのを避けます)
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLResponse *, id, NSError *))completionHandler
{
static NSString *deviceId;
if(!deviceId)
{
deviceId = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
}
NSMutableURLRequest *req = (NSMutableURLRequest *)request;
// Give each request a unique ID for tracing
NSString *reqId = [NSString stringWithFormat:@"%@+%@", deviceId, [[NSUUID UUID] UUIDString] ];
[req setValue:reqId forHTTPHeaderField:"x-myapp-requestId"];
return [super dataTaskWithRequest:req completionHandler:completionHandler];
}
AFNetworking 2.0を使用した例を次に示します
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager.requestSerializer setValue:@"calvinAndHobbesRock" forHTTPHeaderField:@"X-I do what I want"];
[manager GET:@"http://localhost:3000" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
キーは次の2行です。
manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager.requestSerializer setValue:@"calvinAndHobbessRock" forHTTPHeaderField:@"X-I-do-what-I-want"];
応答とリクエストのシリアライザを追加すると、問題が解決しました。
manager.responseSerializer = [AFJSONResponseSerializer serializer];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
このフォームを使用して、特定のヘッダーを使用して予定を作成しました。
AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager];
[operationManager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[operationManager.requestSerializer setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[operationManager POST:url
parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (success) {
success(responseObject);
}
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", [error description]);
}
];
ここに私が最良の選択肢であると信じるものがあります。どこかのシングルトンで、AFHTTPSessionManager
を使用してNSURLSessionConfiguration
を構成し、リクエストを行うたびにそのAFHTTPSessionManager
を使用します。
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.HTTPAdditionalHeaders = @{@"Accepts": @"application/json"};
mySingletonSessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:kMyBaseUrl] sessionConfiguration:config];
私はこれをしました...トークンを渡す人のために
[manager.requestSerializer setValue:[NSString stringWithFormat:@"Token token=\"%@\"", _userObj.oAuth] forHTTPHeaderField:@"Authorization"];