HTTP と HTTPS で同じ API を使用している状況に最適なオプション (アーキテクチャ) は何かと考えていました。HTTP および HTTPS リクエストを同じでサポートする方法はありますAFHTTPRequestOperationManager
か、それとも HTTP リクエスト用と HTTPS リクエスト用の 2 つのサブクラスを用意する必要がありますか?
baseURL
動的に変更することは最善の解決策ではないように感じます
HTTP と HTTPS で同じ API を使用している状況に最適なオプション (アーキテクチャ) は何かと考えていました。HTTP および HTTPS リクエストを同じでサポートする方法はありますAFHTTPRequestOperationManager
か、それとも HTTP リクエスト用と HTTPS リクエスト用の 2 つのサブクラスを用意する必要がありますか?
baseURL
動的に変更することは最善の解決策ではないように感じます
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) { もし (! エラー) { //レスポンスで何かをする } }];