// // GatewayApi.m // PublicFuncClass // // Created by an chen on 12-8-30. // Copyright (c) 2012年 __MyCompanyName__. All rights reserved. // /* * 释放 */ #import "SGGatewayApi.h" #import "NSString+SBJSON.h" #import "SBJSON.h" #import "FuncPublic.h" #import "SGGateway.h" #import "SGDefineInfo.h" #import "FuncPublic.h" @implementation SGGatewayApi @synthesize _mUrl; @synthesize _mvReturn; @synthesize _returnFunction; @synthesize _act; @synthesize receivedBufferData;//返回的信息 @synthesize _objDo; -(id)init { if((self=[super init])) { receivedBufferData = [[NSMutableData alloc]init]; //(**) _objDo = [[NSMutableDictionary alloc]init]; _act = [[NSString alloc] initWithString:@""]; DelayerErro = NO; OnceAlert=YES; } return self; } -(void)dealloc { NSLog(@"释放:%@",_act); SG_RELEASE(receivedBufferData); SG_RELEASE(_mUrl); SG_RELEASE(_act); SG_RELEASE(_objDo); [super dealloc]; } /* * 延时处理 */ -(void)delayer { [_DelayerTimer invalidate]; [[FuncPublic SharedFuncPublic] StopActivityAnimation]; NSLog(@"通信失败:%@",_act); if (OnceAlert) { // OnceAlert=NO; // [self performSelector:@selector(ComeBack) withObject:nil afterDelay:50.0f]; // UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"网络不可用" // message:@"无法与服务器通讯,请连接到移动数据网络或者WIFI" // delegate:self // cancelButtonTitle:@"确定" // otherButtonTitles:nil, nil]; // [alert show]; // [alert release]; [FuncPublic ShowAlert:@"无法与服务器通讯,请连接到移动数据网络或者WIFI" title:@"网络不可用" viewController:nil]; } //[_mvReturn performSelector:_returnFunction withObject:nil]; DelayerErro = YES; } -(void)ComeBack { OnceAlert=YES; } /* * 参数: * * mv: 回调的目标类 * * returnFunc: 回调的方法 * * obj_do: 于后台交互成功后,将信息传回mv类 * * param_post: 于后交互的相关参数 * * str: url信息 * */ -(void)gateway:(id)mv func:(SEL)returnFunc obj_post:(NSMutableDictionary*)obj_post obj_post:(NSMutableDictionary*)param_post STR:(NSString*)str HTTPMethod:(NSString*)_method{ /* * 延时处理,如果通信超过指定时间,则结束通信 */ if (![str isEqualToString:@"UpdateAPNSDevice.aspx"]) { [[FuncPublic SharedFuncPublic] StartActivityAnimation:mv]; } _DelayerTimer = [NSTimer scheduledTimerWithTimeInterval:GATEWAY_DELAYER target:self selector:@selector(delayer) userInfo:nil repeats:NO]; _mvReturn = mv; _returnFunction = returnFunc; _objDo = obj_post; if( ![[param_post objectForKey:@"t"] isEqual:@""] )//关键联接名 { if( [param_post objectForKey:@"t"] == nil ) { _act = str; } else { _act = [param_post objectForKey:@"t"]; } } _mUrl = [[NSString alloc] initWithString:[NSString stringWithFormat:@"%@%@",SERVER,str]]; /* * 增加一些固传参数 code start */ if( [param_post objectForKey:@"code"] != nil ) { NSArray *array = [param_post allKeys];//[[param_post allKeys]sortedArrayUsingSelector: @selector(compare:)]; NSString* post = @""; for(int i = 0; i<[array count]; i++){ if( [[param_post objectForKey:[array objectAtIndex:i]] isEqualToString:@"nn"]) continue; post = [post stringByAppendingString:[param_post objectForKey:[array objectAtIndex:i]]]; } post = [post stringByAppendingFormat:@"WERTY#$&(HJKfghjWERTYUIFGJFGHadf2222"]; post = [FuncPublic md5:post]; [param_post setObject:post forKey:@"code"]; } /* * code end */ //生成post的数据 NSData *postData = [self generateFormDataFromPostDictionary:param_post];//将传入的单独obj_post中的key使用=和&组合 NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]]; //post的长度 NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; [request setHTTPMethod:@"POST"]; //设置使用的方法 [request setValue:postLength forHTTPHeaderField:@"Content-Length"];//设置数据的长度 [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];//数据的类型 [request setHTTPBody:postData]; //设置发送的数据 NSString* post_string = [[NSString alloc] initWithData:postData encoding:NSUTF8StringEncoding];//将nsdata转为encoding if( [_method isEqualToString:@"POST"] ) { [request setURL:[NSURL URLWithString:_mUrl]]; }else if( [_method isEqualToString:@"POSTtwo"] ) { [request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@",SERVERTwo,str]]]; }else { [request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@?%@",_mUrl,post_string ]]]; //设置调用的url } NSLog(@"%@",[NSString stringWithFormat:@"%@?%@",_mUrl,post_string ]); NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self]; //开始连接后台 if (conn) { } else { } SG_RELEASE(post_string); [param_post removeAllObjects]; SG_RELEASE(param_post); } - (void)connection:(NSURLConnection *)conn didReceiveResponse:(NSURLResponse *)res { [receivedBufferData setLength:0]; } - (void)connection:(NSURLConnection *)conn didReceiveData:(NSData *)receivedData { [receivedBufferData appendData:receivedData]; //添加记录的资料 } - (void)connection:(NSURLConnection *)conn didFailWithError:(NSError *)error { } -(NSString *)HandelData:(NSString *)str_ { NSString *string=nil; //ValidateUserIDAndPassword.aspx UpdateAPNSDevice.aspx InsertBookComment.aspx if ([_act isEqualToString:@"InsertSuggestInfo.aspx"]||[_act isEqualToString:@"UpdateAPNSDevice.aspx"]||[_act isEqualToString:@"InsertBookComment.aspx"]) { string=[NSString stringWithFormat:@"{\"data\":[{\"result\":%@}]}",str_]; return string; } string=str_; return string; } - (void)connectionDidFinishLoading:(NSURLConnection *)conn { NSLog(@"apiReturnOk:%@",_act); if( DelayerErro ) return; [_DelayerTimer invalidate]; NSString* stra = [[NSString alloc] initWithData:receivedBufferData encoding:NSUTF8StringEncoding]; //转换信息 //去除两边空格 NSString* str = [[NSString alloc]initWithFormat:@"%@",[stra stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]; SG_RELEASE(stra); if ([str isEqualToString: @""] == YES) { return; } if(1){ NSLog(@"[%@]",str); } NSString *handleStr=[self HandelData:str]; NSMutableDictionary * obj_return = [handleStr JSONValue];//使用js解压 if( obj_return == nil ) { [[FuncPublic SharedFuncPublic] StopActivityAnimation];//需要于funcpublic共用 // [FuncPublic ShowAlert:@"Api错误!"]; // [FuncPublic ShowAlert:@"没有数据!"]; [FuncPublic ShowAlert:@"没有数据!" title:nil viewController:nil]; return; } NSLog(@"jsonDecode完成:%@",_act); [_objDo setObject:obj_return forKey:@"apiReturnData"];//将当前返回的信息和之前传入的参数,整合 NSLog(@"开始回调:%@",_act); [_mvReturn performSelector:_returnFunction withObject:_objDo];//传到想应的方法中 _objDo:之前如果有传参进来,一并返回 SG_RELEASE(str); NSLog(@"接口%@完成",_act); [[FuncPublic SharedFuncPublic] StopActivityAnimation]; } - (NSData*)generateFormDataFromPostDictionary:(NSDictionary*)dict { NSArray* keys = [dict allKeys]; NSMutableData* result = [NSMutableData data]; for (int i = 0; i < [keys count]; i++) { id value = [dict valueForKey: [keys objectAtIndex:i]]; if(i > 0){ [result appendData:[@"&" dataUsingEncoding:NSUTF8StringEncoding]];//NSASCIIStringEncoding } [result appendData:[[NSString stringWithFormat:@"%@" ,[keys objectAtIndex:i]] dataUsingEncoding:NSUTF8StringEncoding]]; [result appendData:[@"=" dataUsingEncoding:NSUTF8StringEncoding]]; if ([value isKindOfClass:[NSData class]]) { [result appendData:value]; } else { [result appendData:DATA(value)]; } } return result; } @end