RequestTool.m 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. //
  2. // RequestTool.m
  3. // TianShanTrek
  4. //
  5. // Created by 韩驰 on 2018/6/1.
  6. // Copyright © 2018 Ellina. All rights reserved.
  7. //
  8. #import "RequestTool.h"
  9. #import "NetworkConfig.h"
  10. @implementation RequestTool
  11. + (void)get:(NSString *)url params:(NSDictionary *)params success:(void (^)(id responseObject))success failure:(void (^)(NSError *error))failure{
  12. // 1.创建请求管理者
  13. AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
  14. mgr.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/html", nil];
  15. mgr.requestSerializer = [AFJSONRequestSerializer serializer];
  16. [mgr.requestSerializer setValue:@"*/*" forHTTPHeaderField:@"Accept"];
  17. [mgr.requestSerializer setValue:@"application/json;charset=utf-8"
  18. forHTTPHeaderField:@"Content-Type"];
  19. if([UserModel shareInstance].token){
  20. [mgr.requestSerializer setValue:[UserModel shareInstance].token
  21. forHTTPHeaderField:@"Authorization"];
  22. }
  23. // [mgr.requestSerializer setValue:sid forHTTPHeaderField:@"sid"];
  24. // 使用版本化URL构建完整请求路径
  25. NSMutableString * mutaStr = [[NSMutableString alloc] initWithString:[NetworkConfig versionedBaseURL]];
  26. [mutaStr appendString:url];
  27. #ifdef DEBUG
  28. NSLog(@"[API Request] %@", mutaStr); // Debug模式下记录完整URL
  29. #endif
  30. // 2.发送请求GET
  31. [mgr GET:mutaStr parameters:params headers:nil progress:^(NSProgress * _Nonnull uploadProgress) {
  32. } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  33. // 防护检查:responseObject 必须是字典
  34. if (!responseObject || ![responseObject isKindOfClass:[NSDictionary class]]) {
  35. if (!responseObject) {
  36. NSLog(@"[RequestTool-GET] Warning: responseObject is nil");
  37. } else {
  38. NSLog(@"[RequestTool-GET] Warning: responseObject is not NSDictionary, type: %@", NSStringFromClass([responseObject class]));
  39. }
  40. responseObject = @{};
  41. }
  42. if (success) {
  43. success(responseObject);
  44. }
  45. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  46. // [Utilites showMessage:@"网络不给力,请求超时"];
  47. if (failure) {
  48. // failure(error);
  49. NSHTTPURLResponse *response = (NSHTTPURLResponse*)task.response;
  50. //通讯协议状态码
  51. NSInteger statusCode = response.statusCode;
  52. //服务器返回的业务逻辑报文信息
  53. NSString* errResponse = [[NSString alloc] initWithData:(NSData *)error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] encoding:NSUTF8StringEncoding];
  54. NSDictionary *json = @{};
  55. if(![errResponse isEqualToString:@""]){
  56. json = [self dictionaryWithJson_String:errResponse];
  57. }
  58. if ([json[@"status"] integerValue] == 401) {
  59. NSLog(@"%@",url);
  60. }
  61. }
  62. }];
  63. }
  64. + (void)post:(NSString *)url params:(NSDictionary *)params success:(void (^)(id responseObject))success failure:(void (^)(NSError *error))failure
  65. {
  66. // 1.创建请求管理者
  67. AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
  68. // ========== SSL/TLS 验证配置日志 ==========
  69. #ifdef DEBUG
  70. NSLog(@"========== SSL/TLS Configuration ==========");
  71. NSLog(@"[SSL] SecurityPolicy: %@", mgr.securityPolicy);
  72. NSLog(@"[SSL] ValidatesDomainName: %@", @(mgr.securityPolicy.validatesDomainName));
  73. NSLog(@"[SSL] AllowInvalidCertificates: %@", @(mgr.securityPolicy.allowInvalidCertificates));
  74. NSLog(@"========== SSL/TLS Configuration End ==========");
  75. #endif
  76. mgr.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/html", nil];
  77. mgr.requestSerializer = [AFJSONRequestSerializer serializer];
  78. // 设置超时时间
  79. mgr.requestSerializer.timeoutInterval = 30.0;
  80. [mgr.requestSerializer setValue:@"*/*" forHTTPHeaderField:@"Accept"];
  81. [mgr.requestSerializer setValue:@"application/json;charset=utf-8"
  82. forHTTPHeaderField:@"Content-Type"];
  83. if([UserModel shareInstance].token){
  84. [mgr.requestSerializer setValue:[UserModel shareInstance].token
  85. forHTTPHeaderField:@"Authorization"];
  86. }
  87. // [mgr.requestSerializer setValue:sid forHTTPHeaderField:@"sid"];
  88. // 使用版本化URL构建完整请求路径
  89. NSMutableString * mutaStr = [[NSMutableString alloc] initWithString:[NetworkConfig versionedBaseURL]];
  90. [mutaStr appendString:url];
  91. #ifdef DEBUG
  92. NSLog(@"========== API Request START ==========");
  93. NSLog(@"[API Request] Method: POST");
  94. NSLog(@"[API Request] URL: %@", mutaStr);
  95. NSLog(@"[API Request] Params: %@", params);
  96. NSLog(@"[API Request] Token: %@", [UserModel shareInstance].token ?: @"<none>");
  97. NSLog(@"[API Request] Base URL: %@", [NetworkConfig versionedBaseURL]);
  98. NSLog(@"[API Request] Timeout: 30.0 seconds");
  99. NSLog(@"========================================");
  100. #endif
  101. // 2.发送请求
  102. [mgr POST:mutaStr parameters:params headers:nil progress:^(NSProgress * _Nonnull uploadProgress) {
  103. } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  104. #ifdef DEBUG
  105. NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)task.response;
  106. NSLog(@"========== API Response SUCCESS ==========");
  107. NSLog(@"[API Response] HTTP Status: %ld", (long)httpResponse.statusCode);
  108. NSLog(@"[API Response] URL: %@", httpResponse.URL);
  109. NSLog(@"[API Response] Response Headers: %@", httpResponse.allHeaderFields);
  110. NSLog(@"[API Response] Data: %@", responseObject);
  111. NSLog(@"==========================================");
  112. #endif
  113. // 防护检查:responseObject 必须是字典
  114. if (!responseObject || ![responseObject isKindOfClass:[NSDictionary class]]) {
  115. if (!responseObject) {
  116. NSLog(@"[RequestTool] Warning: responseObject is nil");
  117. } else {
  118. NSLog(@"[RequestTool] Warning: responseObject is not NSDictionary, type: %@", NSStringFromClass([responseObject class]));
  119. }
  120. responseObject = @{};
  121. }
  122. if (success) {
  123. success(responseObject);
  124. }
  125. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  126. #ifdef DEBUG
  127. NSHTTPURLResponse *response = (NSHTTPURLResponse*)task.response;
  128. NSLog(@"========== API Response FAILURE ==========");
  129. NSLog(@"[API Error] URL: %@", mutaStr);
  130. NSLog(@"[API Error] HTTP Status: %ld", (long)response.statusCode);
  131. NSLog(@"[API Error] Error Code: %ld", (long)error.code);
  132. NSLog(@"[API Error] Error Domain: %@", error.domain);
  133. NSLog(@"[API Error] Error Description: %@", error.description);
  134. NSLog(@"[API Error] Error Localized: %@", error.localizedDescription);
  135. // SSL/TLS 相关错误
  136. if ([error.domain isEqualToString:NSURLErrorDomain]) {
  137. if (error.code == NSURLErrorServerCertificateUntrusted) {
  138. NSLog(@"[API Error] SSL Error: 服务器证书不受信任");
  139. } else if (error.code == NSURLErrorServerCertificateHasUnknownRoot) {
  140. NSLog(@"[API Error] SSL Error: 服务器证书的根证书未知");
  141. } else if (error.code == NSURLErrorServerCertificateNotYetValid) {
  142. NSLog(@"[API Error] SSL Error: 服务器证书尚未生效");
  143. } else if (error.code == NSURLErrorClientCertificateRejected) {
  144. NSLog(@"[API Error] SSL Error: 客户端证书被拒绝");
  145. }
  146. }
  147. NSLog(@"[API Error] Full Error: %@", error);
  148. NSLog(@"[API Error] Error UserInfo: %@", error.userInfo);
  149. NSLog(@"==========================================");
  150. #endif
  151. if (failure) {
  152. NSHTTPURLResponse *response = (NSHTTPURLResponse*)task.response;
  153. //通讯协议状态码
  154. NSInteger statusCode = response.statusCode;
  155. //服务器返回的业务逻辑报文信息
  156. NSString* errResponse = [[NSString alloc] initWithData:(NSData *)error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] encoding:NSUTF8StringEncoding];
  157. NSDictionary *json = [self dictionaryWithJson_String:errResponse];
  158. if ([json[@"status"] integerValue] == 401) {
  159. }else
  160. {
  161. NSLog(@"%@",url);
  162. }
  163. }
  164. }];
  165. }
  166. + (NSDictionary *)dictionaryWithJson_String:(NSString *)jsonString
  167. {
  168. if (jsonString == nil || [jsonString isEqualToString:@""]) {
  169. return nil;
  170. }
  171. NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
  172. NSError *err;
  173. NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData
  174. options:NSJSONReadingMutableContainers
  175. error:&err];
  176. if(err)
  177. {
  178. NSLog(@"json解析失败:%@",err);
  179. return nil;
  180. }
  181. return dic;
  182. }
  183. @end