MOOtherNetAPIClient.m 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. //
  2. // MOOtherNetAPIClient.m
  3. // MiMoLive
  4. //
  5. // Created by SuperC on 2025/4/8.
  6. //
  7. #import "MOOtherNetAPIClient.h"
  8. #import "MOAPIUrl.h"
  9. static MOOtherNetAPIClient *_sharedClient = nil;
  10. static dispatch_once_t onceToken;
  11. //默认的请求超时时间
  12. const static NSTimeInterval kRequestTimeout = 30.0;
  13. @implementation MOOtherNetAPIClient
  14. + (MOOtherNetAPIClient *)sharedJsonClient{
  15. dispatch_once(&onceToken, ^
  16. {
  17. _sharedClient = [[MOOtherNetAPIClient alloc] initWithBaseURL:[NSURL URLWithString:kNetPath_Base]];
  18. });
  19. return _sharedClient;
  20. }
  21. + (MOOtherNetAPIClient *)jsonClientWithBaseUrl:(NSString *)baseUrl{
  22. if ([baseUrl isEqualToString:@""] ||baseUrl == nil)
  23. {
  24. _sharedClient = [[MOOtherNetAPIClient alloc] initWithBaseURL:[NSURL URLWithString:kNetPath_Base]];
  25. }
  26. else
  27. {
  28. _sharedClient = [[MOOtherNetAPIClient alloc] initWithBaseURL:[NSURL URLWithString:baseUrl]];
  29. }
  30. return _sharedClient;
  31. }
  32. + (void)attempDealloc{
  33. onceToken = 0;
  34. _sharedClient = nil;
  35. MOLogV(@"setHttpHeaderData:::: dealloc");
  36. }
  37. - (id)initWithBaseURL:(NSURL *)url{
  38. self = [super initWithBaseURL:url];
  39. if (!self)
  40. {
  41. return nil;
  42. }
  43. self.responseSerializer = [AFJSONResponseSerializer serializer];
  44. self.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/plain", @"text/javascript", @"text/json", @"text/html",nil];
  45. self.requestSerializer = [AFJSONRequestSerializer serializer];
  46. self.requestSerializer.timeoutInterval = kRequestTimeout;
  47. // [self.requestSerializer setValue:@"Content-Type" forHTTPHeaderField:@"application/json; charset=utf-8"];
  48. //证书校验模式为None
  49. AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
  50. securityPolicy.allowInvalidCertificates = YES;
  51. securityPolicy.validatesDomainName = NO;
  52. self.securityPolicy = securityPolicy;
  53. return self;
  54. }
  55. - (void)requestJsonDataWithPath:(NSString *)aPath withParams:(NSDictionary*)params withMethodType:(int)networkMethodInt andBlock:(void (^)(id data, NSError *error))block
  56. {
  57. [self requestJsonDataWithPath:aPath withParams:params withMethodType:networkMethodInt requestTimeout:kRequestTimeout andBlock:block];
  58. }
  59. - (void)requestJsonDataWithPath:(NSString *)aPath withParams:(NSDictionary*)params withMethodType:(int)networkMethodInt requestTimeout:(NSTimeInterval)requestTimeout andBlock:(void (^)(id data, NSError *error))block{
  60. //判断请求超时时间是否符合要求
  61. if (fabs(requestTimeout - self.requestSerializer.timeoutInterval) > 0.1)
  62. {
  63. self.requestSerializer.timeoutInterval = requestTimeout;
  64. }
  65. [self setHttpHeaderData];
  66. //发起请求
  67. switch (networkMethodInt)
  68. {
  69. case Get:
  70. {
  71. [self GET:aPath parameters:params headers:nil progress:^(NSProgress * _Nonnull downloadProgress)
  72. {
  73. }
  74. success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject)
  75. {
  76. //添加接口访问时长计算
  77. NSTimeInterval apiEndTime = [[NSDate date] timeIntervalSince1970];
  78. NSUInteger endTimestamp = apiEndTime * 1000;
  79. //DDLogVerbose(@"=====> %@ response:%@",aPath,responseObject);
  80. id error = [self handleResponse:responseObject];
  81. if (error)
  82. {
  83. block(nil, error);
  84. }
  85. else
  86. {
  87. block(responseObject, nil);
  88. }
  89. }
  90. failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)
  91. {
  92. block(nil, error);
  93. }];
  94. break;
  95. }
  96. case Post:
  97. {
  98. [self POST:aPath parameters:params headers:nil progress:^(NSProgress * _Nonnull uploadProgress)
  99. {
  100. }
  101. success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject)
  102. {
  103. id error = [self handleResponse:responseObject];
  104. if (error)
  105. {
  106. block(nil, error);
  107. }
  108. else
  109. {
  110. block(responseObject, nil);
  111. }
  112. }
  113. failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)
  114. {
  115. block(nil, error);
  116. }];
  117. break;
  118. }
  119. case Put:
  120. {
  121. [self PUT:aPath parameters:params headers:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject)
  122. {
  123. id error = [self handleResponse:responseObject];
  124. if (error)
  125. {
  126. block(nil, error);
  127. }
  128. else
  129. {
  130. block(responseObject, nil);
  131. }
  132. }
  133. failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)
  134. {
  135. block(nil, error);
  136. }];
  137. break;
  138. }
  139. case Delete:
  140. {
  141. [self DELETE:aPath parameters:params headers:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject)
  142. {
  143. id error = [self handleResponse:responseObject];
  144. if (error)
  145. {
  146. block(nil, error);
  147. }
  148. else
  149. {
  150. block(responseObject, nil);
  151. }
  152. }
  153. failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error)
  154. {
  155. block(nil, error);
  156. }];
  157. break;
  158. }
  159. default:
  160. break;
  161. }
  162. }
  163. #pragma mark -- 错误码处理 --
  164. - (id)handleResponse:(id)responseJSON
  165. {
  166. NSError *error = nil;
  167. if ([responseJSON isKindOfClass:[NSArray class]])
  168. {
  169. return error;
  170. }
  171. //code为非0值时,表示有错
  172. NSNumber *resultCode = [responseJSON valueForKeyPath:@"ErrorCode"];
  173. if (resultCode.intValue!=0)
  174. {
  175. error = [NSError errorWithDomain:kNetPath_Base code:resultCode.intValue userInfo:responseJSON];
  176. return error;
  177. }
  178. return error;
  179. }
  180. - (void)setHttpHeaderData{
  181. NSString *currentLanguage = [NSBundle currentLanguage];
  182. [self.requestSerializer setValue:currentLanguage forHTTPHeaderField:@"Accept-Language"];
  183. // 拼接客户 ID 和客户密钥
  184. NSString *plainCredentials = [NSString stringWithFormat:@"%@:%@", AgoraAPIID, AgoraAPISecret];
  185. // 使用 base64 编码
  186. NSData *plainData = [plainCredentials dataUsingEncoding:NSUTF8StringEncoding];
  187. NSString *base64Credentials = [plainData base64EncodedStringWithOptions:0];
  188. // 创建 Authorization Header
  189. NSString *authorizationHeader = [NSString stringWithFormat:@"Basic %@", base64Credentials];
  190. [self.requestSerializer setValue:authorizationHeader forHTTPHeaderField:@"Authorization"];
  191. }
  192. @end