// // RequestTool.m // TianShanTrek // // Created by 韩驰 on 2018/6/1. // Copyright © 2018 Ellina. All rights reserved. // #import "RequestTool.h" #import "NetworkConfig.h" @implementation RequestTool + (void)get:(NSString *)url params:(NSDictionary *)params success:(void (^)(id responseObject))success failure:(void (^)(NSError *error))failure{ // 1.创建请求管理者 AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager]; mgr.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/html", nil]; mgr.requestSerializer = [AFJSONRequestSerializer serializer]; [mgr.requestSerializer setValue:@"*/*" forHTTPHeaderField:@"Accept"]; [mgr.requestSerializer setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Content-Type"]; if([UserModel shareInstance].token){ [mgr.requestSerializer setValue:[UserModel shareInstance].token forHTTPHeaderField:@"Authorization"]; } // [mgr.requestSerializer setValue:sid forHTTPHeaderField:@"sid"]; // 使用版本化URL构建完整请求路径 NSMutableString * mutaStr = [[NSMutableString alloc] initWithString:[NetworkConfig versionedBaseURL]]; [mutaStr appendString:url]; #ifdef DEBUG NSLog(@"[API Request] %@", mutaStr); // Debug模式下记录完整URL #endif // 2.发送请求GET [mgr GET:mutaStr parameters:params headers:nil progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { // 防护检查:responseObject 必须是字典 if (!responseObject || ![responseObject isKindOfClass:[NSDictionary class]]) { if (!responseObject) { NSLog(@"[RequestTool-GET] Warning: responseObject is nil"); } else { NSLog(@"[RequestTool-GET] Warning: responseObject is not NSDictionary, type: %@", NSStringFromClass([responseObject class])); } responseObject = @{}; } if (success) { success(responseObject); } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { // [Utilites showMessage:@"网络不给力,请求超时"]; if (failure) { // failure(error); NSHTTPURLResponse *response = (NSHTTPURLResponse*)task.response; //通讯协议状态码 NSInteger statusCode = response.statusCode; //服务器返回的业务逻辑报文信息 NSString* errResponse = [[NSString alloc] initWithData:(NSData *)error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] encoding:NSUTF8StringEncoding]; NSDictionary *json = @{}; if(![errResponse isEqualToString:@""]){ json = [self dictionaryWithJson_String:errResponse]; } if ([json[@"status"] integerValue] == 401) { NSLog(@"%@",url); } } }]; } + (void)post:(NSString *)url params:(NSDictionary *)params success:(void (^)(id responseObject))success failure:(void (^)(NSError *error))failure { // 1.创建请求管理者 AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager]; // ========== SSL/TLS 验证配置日志 ========== #ifdef DEBUG NSLog(@"========== SSL/TLS Configuration =========="); NSLog(@"[SSL] SecurityPolicy: %@", mgr.securityPolicy); NSLog(@"[SSL] ValidatesDomainName: %@", @(mgr.securityPolicy.validatesDomainName)); NSLog(@"[SSL] AllowInvalidCertificates: %@", @(mgr.securityPolicy.allowInvalidCertificates)); NSLog(@"========== SSL/TLS Configuration End =========="); #endif mgr.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/html", nil]; mgr.requestSerializer = [AFJSONRequestSerializer serializer]; // 设置超时时间 mgr.requestSerializer.timeoutInterval = 30.0; [mgr.requestSerializer setValue:@"*/*" forHTTPHeaderField:@"Accept"]; [mgr.requestSerializer setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Content-Type"]; if([UserModel shareInstance].token){ [mgr.requestSerializer setValue:[UserModel shareInstance].token forHTTPHeaderField:@"Authorization"]; } // [mgr.requestSerializer setValue:sid forHTTPHeaderField:@"sid"]; // 使用版本化URL构建完整请求路径 NSMutableString * mutaStr = [[NSMutableString alloc] initWithString:[NetworkConfig versionedBaseURL]]; [mutaStr appendString:url]; #ifdef DEBUG NSLog(@"========== API Request START =========="); NSLog(@"[API Request] Method: POST"); NSLog(@"[API Request] URL: %@", mutaStr); NSLog(@"[API Request] Params: %@", params); NSLog(@"[API Request] Token: %@", [UserModel shareInstance].token ?: @""); NSLog(@"[API Request] Base URL: %@", [NetworkConfig versionedBaseURL]); NSLog(@"[API Request] Timeout: 30.0 seconds"); NSLog(@"========================================"); #endif // 2.发送请求 [mgr POST:mutaStr parameters:params headers:nil progress:^(NSProgress * _Nonnull uploadProgress) { } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { #ifdef DEBUG NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)task.response; NSLog(@"========== API Response SUCCESS =========="); NSLog(@"[API Response] HTTP Status: %ld", (long)httpResponse.statusCode); NSLog(@"[API Response] URL: %@", httpResponse.URL); NSLog(@"[API Response] Response Headers: %@", httpResponse.allHeaderFields); NSLog(@"[API Response] Data: %@", responseObject); NSLog(@"=========================================="); #endif // 防护检查:responseObject 必须是字典 if (!responseObject || ![responseObject isKindOfClass:[NSDictionary class]]) { if (!responseObject) { NSLog(@"[RequestTool] Warning: responseObject is nil"); } else { NSLog(@"[RequestTool] Warning: responseObject is not NSDictionary, type: %@", NSStringFromClass([responseObject class])); } responseObject = @{}; } if (success) { success(responseObject); } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { #ifdef DEBUG NSHTTPURLResponse *response = (NSHTTPURLResponse*)task.response; NSLog(@"========== API Response FAILURE =========="); NSLog(@"[API Error] URL: %@", mutaStr); NSLog(@"[API Error] HTTP Status: %ld", (long)response.statusCode); NSLog(@"[API Error] Error Code: %ld", (long)error.code); NSLog(@"[API Error] Error Domain: %@", error.domain); NSLog(@"[API Error] Error Description: %@", error.description); NSLog(@"[API Error] Error Localized: %@", error.localizedDescription); // SSL/TLS 相关错误 if ([error.domain isEqualToString:NSURLErrorDomain]) { if (error.code == NSURLErrorServerCertificateUntrusted) { NSLog(@"[API Error] SSL Error: 服务器证书不受信任"); } else if (error.code == NSURLErrorServerCertificateHasUnknownRoot) { NSLog(@"[API Error] SSL Error: 服务器证书的根证书未知"); } else if (error.code == NSURLErrorServerCertificateNotYetValid) { NSLog(@"[API Error] SSL Error: 服务器证书尚未生效"); } else if (error.code == NSURLErrorClientCertificateRejected) { NSLog(@"[API Error] SSL Error: 客户端证书被拒绝"); } } NSLog(@"[API Error] Full Error: %@", error); NSLog(@"[API Error] Error UserInfo: %@", error.userInfo); NSLog(@"=========================================="); #endif if (failure) { NSHTTPURLResponse *response = (NSHTTPURLResponse*)task.response; //通讯协议状态码 NSInteger statusCode = response.statusCode; //服务器返回的业务逻辑报文信息 NSString* errResponse = [[NSString alloc] initWithData:(NSData *)error.userInfo[AFNetworkingOperationFailingURLResponseDataErrorKey] encoding:NSUTF8StringEncoding]; NSDictionary *json = [self dictionaryWithJson_String:errResponse]; if ([json[@"status"] integerValue] == 401) { }else { NSLog(@"%@",url); } } }]; } + (NSDictionary *)dictionaryWithJson_String:(NSString *)jsonString { if (jsonString == nil || [jsonString isEqualToString:@""]) { return nil; } NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; NSError *err; NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err]; if(err) { NSLog(@"json解析失败:%@",err); return nil; } return dic; } @end