web-dev-qa-db-ja.com

AFNetworking 2.0は、GET要求にヘッダーを追加します

私は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ヘッダーの設定方法がわかりません。

任意の助けをいただければ幸いです。
よろしく、
マイク

78
Mackey18

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];
}
83
RyanR

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"];
145
Shaheen Ghiassy

応答とリクエストのシリアライザを追加すると、問題が解決しました。

manager.responseSerializer = [AFJSONResponseSerializer serializer];
manager.requestSerializer = [AFJSONRequestSerializer serializer];

[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
17
user2073541

このフォームを使用して、特定のヘッダーを使用して予定を作成しました。

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]);

               }
 ];
7
Carlos Avalos

ここに私が最良の選択肢であると信じるものがあります。どこかのシングルトンで、AFHTTPSessionManagerを使用してNSURLSessionConfigurationを構成し、リクエストを行うたびにそのAFHTTPSessionManagerを使用します。

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.HTTPAdditionalHeaders = @{@"Accepts": @"application/json"};

mySingletonSessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:kMyBaseUrl] sessionConfiguration:config];
6
Chris

私はこれをしました...トークンを渡す人のために

[manager.requestSerializer setValue:[NSString stringWithFormat:@"Token token=\"%@\"", _userObj.oAuth] forHTTPHeaderField:@"Authorization"];
2
Surge Pedroza