0

HTTP と HTTPS で同じ API を使用している状況に最適なオプション (アーキテクチャ) は何かと考えていました。HTTP および HTTPS リクエストを同じでサポートする方法はありますAFHTTPRequestOperationManagerか、それとも HTTP リクエスト用と HTTPS リクエスト用の 2 つのサブクラスを用意する必要がありますか?

baseURL動的に変更することは最善の解決策ではないように感じます

4

1 に答える 1

1

2 つの AFHTTPClient* オブジェクトを保持できます。1 つは http 用で、もう 1 つは安全な https 用です。これは、私の Requester クラスに基づく例です。

-- Requester.h ---

#import "Foundation/Foundation.h"
#import "AFNetworking.h"

typedef 列挙型
{
    MultipartTypeImageJPEG、
    MultipartTypeImagePNG、
    MultipartTypeVideoQuicktime
マルチパートタイプ;

typedef 列挙型
{
    HTTPメソッドGET、
    HTTPMethodPOST、
    HTTPメソッドPUT、
    HTTPMethodDELETE
} HTTPメソッド;

typedef void (^RequestCallback)(NSError *error, NSInteger statusCode, id json);

@interface リクエスター: NSObject

/**
 * シングルトン
 */
+ (インスタンスタイプ)sharedInstance;

- (void)requestToPath:(NSString *)パス
               メソッド:(HTTPメソッド)メソッド
               params:(NSDictionary *)params
             完全:(RequestCallback)コールバック;

- (void)requestMultipartToPath:(NSString *)パス
                        メソッド:(HTTPメソッド)メソッド
                        params:(NSDictionary *)params
                      fileData:(NSData *)fileData
                      ファイル名:(NSString *)ファイル名
                          タイプ:(MultipartType)multiPartType
                      完全:(RequestCallback)コールバック;


- (void)secureRequestToPath:(NSString *)パス
              メソッド:(HTTPメソッド)メソッド
              params:(NSDictionary *)params
            完全:(RequestCallback)コールバック;

-- Requester.m ---

#import "Requester.h"

@interface リクエスター()

@property (非アトミック、強力) AFHTTPClient *httpClient;
@property (非アトミック、強力) AFHTTPClient *httpClientSecure;

@終わり

@実装リクエスタ

+ (インスタンスタイプ)sharedInstance
{
    静的 ID インスタンス = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceトークン, ^{
        インスタンス = [[自己割り当て] 初期化];
    });

    インスタンスを返します。
}

+ (無効) 初期化
{
    [超初期化];


    NSURL *baseURL = [NSURL URLWithString:YOUR_BASE_ADDRESS_HTTP];
    NSURL *secureBaseURL = [NSURL URLWithString:YOUR_BASE_ADDRESS_HTTPS];

    [リクエスタ sharedInstance].httpClient = [AFHTTPClient clientWithBaseURL:baseURL];
    [リクエスタ共有インスタンス].httpClient.parameterEncoding = AFJSONParameterEncoding;

    [リクエスタ sharedInstance].httpClientSecure = [AFHTTPClient clientWithBaseURL:secureBaseURL];
    [リクエスタ共有インスタンス].httpClientSecure.parameterEncoding = AFJSONParameterEncoding;

}

- (id)init
{
    自己 = [スーパー初期化];
    もし (自己) {
        //...
    }
    自分自身を返します。
}


#pragma mak - リクエスト タイプ
- (NSMutableURLRequest*)requestWithPathPOST:(NSString*)path withParams:(NSDictionary*)params
{
    params = [self addRequiredBodyProperties:params];
    NSMutableURLRequest *request = [self.httpClient requestWithMethod:@"POST" path:path parameters:params];
    request.cachePolicy = NSURLRequestReloadIgnoringCacheData;
    request = [self addRequiredHeaderProperties:request];

    返品リクエスト;
}

- (NSMutableURLRequest*)requestWithPathGET:(NSString*)path withParams:(NSDictionary*)params
{
    params = [self addRequiredBodyProperties:params];
    NSMutableURLRequest *request = [self.httpClient requestWithMethod:@"GET" path:path parameters:params];
    request.cachePolicy = NSURLRequestReloadIgnoringCacheData;
    request = [self addRequiredHeaderProperties:request];

    返品リクエスト;
}

- (NSMutableURLRequest*)requestWithPathPUT:(NSString*)path withParams:(NSDictionary*)params
{
    params = [self addRequiredBodyProperties:params];
    NSMutableURLRequest *request = [self.httpClient requestWithMethod:@"PUT" path:path parameters:params];
    request.cachePolicy = NSURLRequestReloadIgnoringCacheData;
    request = [self addRequiredHeaderProperties:request];

    返品リクエスト;
}

- (NSMutableURLRequest*)requestWithPathDEL:(NSString*)path withParams:(NSDictionary*)params
{
    params = [self addRequiredBodyProperties:params];
    NSMutableURLRequest *request = [self.httpClient requestWithMethod:@"DELETE" path:path parameters:params];
    request.cachePolicy = NSURLRequestReloadIgnoringCacheData;
    request = [self addRequiredHeaderProperties:request];

    返品リクエスト;
}

- (NSMutableURLRequest *)addRequiredHeaderProperties:(NSMutableURLRequest *)request
{
    NSMutableDictionary *dic = [[allHTTPHeaderFields を要求] mutableCopy];

    // ここで、リクエストごとに必要ないくつかのヘッダー パラメータを追加します
    NSString *deviceId = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    [dic setObject:deviceId forKey:@"Device-Id"];          
    [dic setObject:@"ios" forKey:@"os"];

    [リクエスト setAllHTTPHeaderFields:dic];

    返品リクエスト;
}

- (NSMutableDictionary *)addRequiredBodyProperties:(NSDictionary *)params
{
    NSMutableDictionary *result = [params mutableCopy];
    if (!結果) {
        結果 = [NSMutableDictionary new];
    }

    // ここで、リクエストごとに必要ないくつかのパラメータを追加します
    もし (API_KEY) {
        [結果 setObject:API_KEY forKey:@"api_key"];
    }


    結果を返します。
}

- (NSMutableURLRequest*)requestMultipartWithPath:(NSString*)path メソッド:(NSString *)method withParams:(NSDictionary*)params fileData:(NSData *)fileData fileName:(NSString *)fileName type:(MultipartType)multyPartType
{
    params = [self addRequiredBodyProperties:params];

    NSString *mimeType = @"";
    NSString *name = @"画像";
    スイッチ (multiPartType) {
        ケース MultipartTypeImageJPEG:

            mimeType = @"画像/jpeg";
            if (ファイル名)
            {
                if ([fileName rangeOfString:@".jpg"].location == NSNotFound && [fileName rangeOfString:@".jpeg"].location == NSNotFound)
                {
                    fileName = [fileName stringByAppendingString:@".jpg"];
                }
            }
            壊す;
        ケース MultipartTypeImagePNG:

            mimeType = @"画像/png";
            if (ファイル名)
            {
                if ([fileName rangeOfString:@".png"].location == NSNotFound)
                {
                    fileName = [fileName stringByAppendingString:@".png"];
                }
            }

            壊す;
        ケース MultipartTypeVideoQuicktime:
            mimeType = @"video/quicktime";
            名前 = @「ビデオ」;
            壊す;
    }

    if (!method || [method isEqualToString:@""])
    {
        メソッド = @"POST";
    }

    NSMutableURLRequest *request = [self.httpClient multipartFormRequestWithMethod:method path:path parameters:params constructingBodyWithBlock:^(id formData) {
        [formData appendPartWithFileData:fileData name:name fileName:fileName mimeType:mimeType];
    }];

    request = [self addRequiredHeaderProperties:request];

    返品リクエスト;
}

#pragma mark - グローバル リクエスト

- (void)JSONRequestOperationWithRequest:(NSMutableURLRequest *)request callback:(RequestCallback)callback
{
    [[AFJSONRequestOperation JSONRequestOperationWithRequest:リクエストの成功:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
        if (コールバック) {
            callback(nil,response.statusCode,O);
        }

    } 失敗:^(NSURLRequest *リクエスト、NSHTTPURLResponse *レスポンス、NSError *エラー、id JSON) {
        NSLog(@"%@",error.description);
        NSLog(@"%@",JSON);

        if (コールバック) {
            コールバック (エラー、response.statusCode、JSON);
        }
    }] 始める];
}

#pragma マーク -

- (void)requestToPath:(NSString *)path メソッド:(HTTPMethod)メソッド params:(NSDictionary *)params complete:(RequestCallback)callback
{
    NSMutableURLRequest *request = nil;
    スイッチ (メソッド) {
        ケース HTTPMethodGET:
            request = [self requestWithPathGET:path withParams:params];
            壊す;
        ケース HTTPMethodPUT:
            request = [self requestWithPathPUT:path withParams:params];
            壊す;
        ケース HTTPMethodPOST:
            request = [self requestWithPathPOST:path withParams:params];
            壊す;
        ケース HTTPMethodDELETE:
            request = [self requestWithPathDEL:path withParams:params];
            壊す;
    }

    [self JSONRequestOperationWithRequest:リクエスト コールバック:コールバック];
}

- (void)requestMultipartToPath:(NSString *)path メソッド:(HTTPMethod)メソッド params:(NSDictionary *)params fileData:(NSData *)fileData fileName:(NSString *)fileName type:(MultipartType)multyPartType complete:(RequestCallback)callback
{
    NSString *methodString = @"";
    スイッチ (メソッド) {
        ケース HTTPMethodGET:
            methodString = @"GET";
            壊す;
        ケース HTTPMethodPUT:
            methodString = @"PUT";
            壊す;
        ケース HTTPMethodPOST:
            methodString = @"POST";
            壊す;
        ケース HTTPMethodDELETE:
            methodString = @"DELETE";
            壊す;
    }

    NSMutableURLRequest *request = [self requestMultipartWithPath:path メソッド:methodString withParams:params fileData:fileData fileName:fileName type:multyPartType];
    [self JSONRequestOperationWithRequest:リクエスト コールバック:コールバック];
}

- (void)secureRequestToPath:(NSString *)path メソッド:(HTTPMethod)メソッド params:(NSDictionary *)params complete:(RequestCallback)callback
{    
    NSMutableURLRequest *request = nil;
    スイッチ (メソッド) {
        ケース HTTPMethodGET:
            request = [self.httpClientSecure requestWithMethod:@"GET" path:path parameters:params];
            壊す;
        ケース HTTPMethodPUT:
            request = [self.httpClientSecure requestWithMethod:@"PUT" パス:パス パラメータ:params];
            壊す;
        ケース HTTPMethodPOST:
            request = [self.httpClientSecure requestWithMethod:@"POST" パス:パス パラメータ:params];
            壊す;
        ケース HTTPMethodDELETE:
            request = [self.httpClientSecure requestWithMethod:@"DELETE" パス:パス パラメータ:params];
            壊す;
    }

    AFJSONRequestOperation *oper = [AFJSONRequestOperation JSONRequestOperationWithRequest:リクエスト
                                                     成功:^(NSURLRequest *リクエスト、NSHTTPURLResponse *レスポンス、id JSON) {                                                         

                                                         if (コールバック) {
                                                             callback(nil,response.statusCode,JSON);
                                                         }
      } 失敗:^(NSURLRequest *リクエスト、NSHTTPURLResponse *レスポンス、NSError *エラー、id JSON) {
          NSLog(@"%@",error.description);
          NSLog(@"%@",JSON);

          if (コールバック) {
              コールバック (エラー、response.statusCode、JSON);
          }
      }];

    [オペラ開始];
}
@終わり

使用法:

http の場合:

[[リクエスタ sharedInstance] requestToPath:@"user/authenticate"
                                                       メソッド:HTTPMethodPOST
                                                       params:@{@"ユーザー名":ユーザー名,@"パスワード":パスワード}
                                                     完全:^(NSError *エラー、NSInteger statusCode、id json) {
                                                         もし (! エラー) {
                                                             //レスポンスで何かをする
                                                         }

                                                     }];

https の場合:

[[リクエスタ sharedInstance] secureRequestToPath:@"user/authenticate"
                                                       メソッド:HTTPMethodPOST
                                                       params:@{@"ユーザー名":ユーザー名,@"パスワード":パスワード}
                                                     完全:^(NSError *エラー、NSInteger statusCode、id json) {
                                                         もし (! エラー) {
                                                             //レスポンスで何かをする
                                                         }

                                                     }];
于 2014-06-19T21:33:14.920 に答える