0

HTTP 및 HTTPS에서 동일한 API를 사용하는 경우 최상의 옵션 (아키텍처)이 무엇인지 궁금합니다. 동일한 AFHTTPRequestOperationManager에서 HTTP 및 HTTPS 요청을 지원하는 방법이 있습니까? 아니면 두 개의 하위 클래스 (하나는 HTTP 요청, 다른 하나는 HTTPS 요청)를 사용해야합니까? 나는 동적으로 baseURL을 변경 같은 느낌HTTP 및 HTTPS 기본 URL이있는 AFHTTPRequestOperationManager

당신은이 AFHTTPClient * 객체를 저장할 수

+0

'readonly' 속성 인 경우'baseURL'을 변경할 수 없습니다. – sabalaba

답변

1

최선의 해결책이 아닙니다. 하나는 HTTP 용이고 다른 하나는 안전한 https 용입니다. 다음은 내 Requester 클래스를 기반으로 한 예제입니다.

- Requester.h ---

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

typedef enum 
{ 
    MultipartTypeImageJPEG, 
    MultipartTypeImagePNG, 
    MultipartTypeVideoQuicktime 
} MultipartType; 

typedef enum 
{ 
    HTTPMethodGET, 
    HTTPMethodPOST, 
    HTTPMethodPUT, 
    HTTPMethodDELETE 
} HTTPMethod; 

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

@interface Requester : NSObject 

/** 
* Singleton 
*/ 
+ (instancetype)sharedInstance; 

- (void)requestToPath:(NSString *)path 
       method:(HTTPMethod)method 
       params:(NSDictionary *)params 
      complete:(RequestCallback)callback; 

- (void)requestMultipartToPath:(NSString *)path 
         method:(HTTPMethod)method 
         params:(NSDictionary *)params 
         fileData:(NSData *)fileData 
         fileName:(NSString *)fileName 
          type:(MultipartType)multyPartType 
         complete:(RequestCallback)callback; 


- (void)secureRequestToPath:(NSString *)path 
       method:(HTTPMethod)method 
       params:(NSDictionary *)params 
      complete:(RequestCallback)callback; 

- Requester.m ---

 
#import "Requester.h" 

@interface Requester() 

@property (nonatomic, strong) AFHTTPClient *httpClient; 
@property (nonatomic, strong) AFHTTPClient *httpClientSecure; 

@end 

@implementation Requester 

+ (instancetype)sharedInstance 
{ 
    static id instance = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     instance = [[self alloc] init]; 
    }); 

    return instance; 
} 

+ (void)initialize 
{ 
    [super initialize]; 


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

    [Requester sharedInstance].httpClient = [AFHTTPClient clientWithBaseURL:baseURL]; 
    [Requester sharedInstance].httpClient.parameterEncoding = AFJSONParameterEncoding; 

    [Requester sharedInstance].httpClientSecure = [AFHTTPClient clientWithBaseURL:secureBaseURL]; 
    [Requester sharedInstance].httpClientSecure.parameterEncoding = AFJSONParameterEncoding; 

} 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     //... 
    } 
    return self; 
} 


#pragma mak - Request Types 
- (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]; 

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

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

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

    return request; 
} 

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

    // Here adding some header parameters that required on every request 
    NSString *deviceId = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; 
    [dic setObject:deviceId forKey:@"Device-Id"];   
    [dic setObject:@"ios" forKey:@"os"]; 

    [request setAllHTTPHeaderFields:dic]; 

    return request; 
} 

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

    // Here adding some parameters that required on every request 
    if (API_KEY) { 
     [result setObject:API_KEY forKey:@"api_key"]; 
    } 


    return result; 
} 

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

    NSString *mimeType = @""; 
    NSString *name = @"picture"; 
    switch (multyPartType) { 
     case MultipartTypeImageJPEG: 

      mimeType = @"image/jpeg"; 
      if (fileName) 
      { 
       if ([fileName rangeOfString:@".jpg"].location == NSNotFound && [fileName rangeOfString:@".jpeg"].location == NSNotFound) 
       { 
        fileName = [fileName stringByAppendingString:@".jpg"]; 
       } 
      } 
      break; 
     case MultipartTypeImagePNG: 

      mimeType = @"image/png"; 
      if (fileName) 
      { 
       if ([fileName rangeOfString:@".png"].location == NSNotFound) 
       { 
        fileName = [fileName stringByAppendingString:@".png"]; 
       } 
      } 

      break; 
     case MultipartTypeVideoQuicktime: 
      mimeType = @"video/quicktime"; 
      name = @"video"; 
      break; 
    } 

    if (!method || [method isEqualToString:@""]) 
    { 
     method = @"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]; 

    return request; 
} 

#pragma mark - Global Requests 

- (void)JSONRequestOperationWithRequest:(NSMutableURLRequest *)request callback:(RequestCallback)callback 
{ 
    [[AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 
     if (callback) { 
      callback(nil,response.statusCode,O); 
     } 

    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { 
     NSLog(@"%@",error.description); 
     NSLog(@"%@",JSON); 

     if (callback) { 
      callback(error,response.statusCode,JSON); 
     } 
    }] start]; 
} 

#pragma mark - 

- (void)requestToPath:(NSString *)path method:(HTTPMethod)method params:(NSDictionary *)params complete:(RequestCallback)callback 
{ 
    NSMutableURLRequest *request = nil; 
    switch (method) { 
     case HTTPMethodGET: 
      request = [self requestWithPathGET:path withParams:params]; 
      break; 
     case HTTPMethodPUT: 
      request = [self requestWithPathPUT:path withParams:params]; 
      break; 
     case HTTPMethodPOST: 
      request = [self requestWithPathPOST:path withParams:params]; 
      break; 
     case HTTPMethodDELETE: 
      request = [self requestWithPathDEL:path withParams:params]; 
      break; 
    } 

    [self JSONRequestOperationWithRequest:request callback:callback]; 
} 

- (void)requestMultipartToPath:(NSString *)path method:(HTTPMethod)method params:(NSDictionary *)params fileData:(NSData *)fileData fileName:(NSString *)fileName type:(MultipartType)multyPartType complete:(RequestCallback)callback 
{ 
    NSString *methodString = @""; 
    switch (method) { 
     case HTTPMethodGET: 
      methodString = @"GET"; 
      break; 
     case HTTPMethodPUT: 
      methodString = @"PUT"; 
      break; 
     case HTTPMethodPOST: 
      methodString = @"POST"; 
      break; 
     case HTTPMethodDELETE: 
      methodString = @"DELETE"; 
      break; 
    } 

    NSMutableURLRequest *request = [self requestMultipartWithPath:path method:methodString withParams:params fileData:fileData fileName:fileName type:multyPartType]; 
    [self JSONRequestOperationWithRequest:request callback:callback]; 
} 

- (void)secureRequestToPath:(NSString *)path method:(HTTPMethod)method params:(NSDictionary *)params complete:(RequestCallback)callback 
{  
    NSMutableURLRequest *request = nil; 
    switch (method) { 
     case HTTPMethodGET: 
      request = [self.httpClientSecure requestWithMethod:@"GET" path:path parameters:params]; 
      break; 
     case HTTPMethodPUT: 
      request = [self.httpClientSecure requestWithMethod:@"PUT" path:path parameters:params]; 
      break; 
     case HTTPMethodPOST: 
      request = [self.httpClientSecure requestWithMethod:@"POST" path:path parameters:params]; 
      break; 
     case HTTPMethodDELETE: 
      request = [self.httpClientSecure requestWithMethod:@"DELETE" path:path parameters:params]; 
      break; 
    } 

    AFJSONRequestOperation *oper = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
                success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {               

                 if (callback) { 
                  callback(nil,response.statusCode,JSON); 
                 } 
     } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { 
      NSLog(@"%@",error.description); 
      NSLog(@"%@",JSON); 

      if (callback) { 
       callback(error,response.statusCode,JSON); 
      } 
     }]; 

    [oper start]; 
} 
@end 

사용법 : HTTP의

:

 
[[Requester sharedInstance] requestToPath:@"user/authenticate" 
                 method:HTTPMethodPOST 
                 params:@{@"username":username,@"password":password} 
                complete:^(NSError *error, NSInteger statusCode, id json) { 
                 if (!error) { 
                  //do something with response 
                 } 

                }]; 

https :

 
[[Requester sharedInstance] secureRequestToPath:@"user/authenticate" 
                 method:HTTPMethodPOST 
                 params:@{@"username":username,@"password":password} 
                complete:^(NSError *error, NSInteger statusCode, id json) { 
                 if (!error) { 
                  //do something with response 
                 } 

                }]; 
관련 문제