HTTP 网络请求一般格式 YUQNetwork
来源:互联网 发布:手机屏幕色彩校正软件 编辑:程序博客网 时间:2024/05/24 06:10
将项目里边的代码粘贴出来,记录下。
+YUQNetwork.h
<span style="color:#33CC00;">//发送GET请求</span>+ (void)httpGETWithPath:(NSString *)path parameters:(NSDictionary *)paraDic success:(void (^)(NSDictionary *dict))success failure:(void (^)(NSError *error ))failure;<span style="color:#33CC00;">//发送POST请求</span>+ (void)httpPOSTWithPath:(NSString *)path parameters:(NSDictionary *)paraDic success:(void (^)(NSDictionary *dict))success failure:(void (^)(NSError *error ))failure;<span style="color:#33CC00;">//一般的类,基本都是设置参数、路径、调用发送请求方法</span>+ (void)setShowFriend:(NSString *)show_friend success:(void (^)(NSDictionary *dic))success failure:(void (^)(NSError *error))failure;
+YUQNetwork.m
//一般的类,基本都是设置参数、路径、调用发送请求方法+ (void)setShowFriend:(NSString *)show_friend success:(void (^)(NSDictionary *dic))success failure:(void (^)(NSError *error))failure{ NSDictionary *paraDic = @{@"show_friend":show_friend}; NSString *path = [[YUQService urlConfigs] objectForKey:kUser_SetConf]; if (path.length < 1) { if (failure) { failure([NSError failedConfigReopenError]); } return; } path = [YUQService commonPartCombineURLString:path andParams:paraDic isGET:NO]; [YUQNetwork httpPOSTWithPath:path parameters:paraDic success:success failure:failure];}//发送POST请求+ (void)httpPOSTWithPath:(NSString *)path parameters:(NSDictionary *)paraDic success:(void (^)(NSDictionary *dict))success failure:(void (^)(NSError *error ))failure{ if (!path || path.length<1) { if (failure) { YUQDebugLog(@"%s path == nil",__FUNCTION__); failure([NSError failedConfigReopenError]); } return; } AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:path]]; [httpClient postPath:path parameters:paraDic success:^(AFHTTPRequestOperation *operation, id responseObject) {#if DEBUG NSString *str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; YUQDebugLog(@"Request path: %@",path); YUQDebugLog(@"Request responseObject: %@",str);#endif if (!responseObject) { YUQDebugLog(@"Http get responseObject is nil ..."); if (failure) { failure([NSError unknowError]); } return; } NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil]; if (!dic) { if (failure) { failure([NSError unknowError]); } return; } NSString *code = [dic objectForKey:@"code"]; if (![code intValue]) { if (success) { success(dic); } } else { if (failure) { NSString *msgString = [dic objectForKey:@"msg"]; NSError *error = [NSError errorWithMsg:([msgString isEqual:[NSNull null]] ? @"" : msgString) code:[code intValue]]; failure(error); } } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { if (failure) { failure([NSError networkError]); } }];}//发送GET请求+ (void)httpGETWithPath:(NSString *)path parameters:(NSDictionary *)paraDic success:(void (^)(NSDictionary *dict))success failure:(void (^)(NSError *error ))failure{ if (!path || path.length<1) { if (failure) { YUQDebugLog(@"%s path == nil",__FUNCTION__); failure([NSError failedConfigReopenError]); } return; } AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:path]]; [httpClient getPath:path parameters:paraDic success:^(AFHTTPRequestOperation *operation, id responseObject) { #if DEBUG NSString *str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; YUQDebugLog(@"Request path: %@",path); YUQDebugLog(@"Http get responseObject: %@",str);#endif if (!responseObject) { if (failure) { failure([NSError unknowError]); } return; } NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil]; if (!dic) { if (failure) { failure([NSError unknowError]); } return; } NSString *code = [dic objectForKey:@"code"]; if (![code intValue]) { if (success) { success(dic); } } else { NSError *err = [NSError errorWithDomain:YUQ_BASE_URL_STR code:[code intValue] userInfo:@{NSLocalizedDescriptionKey:[dic objectForKey:@"msg"]}]; if (failure) { failure(err); } } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { if (failure) { failure([NSError networkError]); } }];}
对于其中的NSError,
[NSError failedConfigReopenError]是#import "NSError+UserError.h",一个类别方法
if (path.length < 1) { if (failure) { failure([NSError failedConfigReopenError]); } return; }
NSError+UserError.h
/** * 网络错误 * * @return NSError */+ (NSError *)networkError;/** * 获取网络配置失败,请重新启动客户端 * * @return NSError */+ (NSError *)failedConfigReopenError;/** * 未知错误 * * @return NSError */+ (NSError *)unknowError;/** * 其它类型错误 * * @param msgString 错误信息 * @param code 错误码 * * @return NSError */+ (NSError *)errorWithMsg:(NSString *)msgString code:(int)code;
NSError+UserError.m
+ (NSError *)networkError{ NSError *error = [NSError errorWithDomain:YUQ_BASE_URL_STR code:ErrorTypeNetworkError userInfo:@{NSLocalizedDescriptionKey:NSLocalizedString(@"YUQ_NetworkErr", nil)}]; return error;}+ (NSError *)failedConfigReopenError{ NSError *error = [NSError errorWithDomain:YUQ_BASE_URL_STR code:ErrorTypeFailedConfigReopenError userInfo:@{NSLocalizedDescriptionKey:NSLocalizedString(@"YUQ_FialedConfigReopenApp", nil)}]; return error;}+ (NSError *)unknowError{ NSError *error = [NSError errorWithDomain:YUQ_BASE_URL_STR code:ErrorTypeUnknowError userInfo:@{NSLocalizedDescriptionKey:NSLocalizedString(@"YUQ_UnknowErr", nil)}]; return error;}+ (NSError *)errorWithMsg:(NSString *)msgString code:(int)code{ if (code == ErrorTypeVerifyFailed) { msgString = NSLocalizedString(@"YUQ_Register_VerCodeErr",nil); } else if(code == ErrorTypeAlreadyRegistered) { //110001 msgString = NSLocalizedString(@"YUQ_Register_AlreadyReg", nil); } else if(code == ErrorTypeErrorUsernameOrPassword) { //100001 msgString = NSLocalizedString(@"YUQ_Login_Error_User_Or_Password", nil); } else if(code == ErrorTypeErrorHavenotRegistered) { //110002 msgString = NSLocalizedString(@"YUQ_NetworkHaveNotRegistered", nil); } else if(code == ErrorTypeErrorUsernameNotExist) { //100002 msgString = NSLocalizedString(@"YUQ_Login_Error_Username", nil); } else if(code == ErrorTypeErrorZoneErr) { //40000 msgString = NSLocalizedString(@"YUQ_Login_Err_Zone", nil); } else if(code == ErrorTypeErrorVersionErr) { //40001 msgString = NSLocalizedString(@"YUQ_Login_Err_Version", nil); } else if(code == ErrorTypeErrorEventsCycleTime){ //100400 msgString = NSLocalizedString(@"YUQ_Activity_Err_EventsCycleTime", nil); } else if(code == ErrorTypeErrorAcitvityAbnormal){ //100401 msgString = NSLocalizedString(@"YUQ_Activity_Err_AcitvityAbnormal", nil); } else if(code == ErrorTypeErrorActivityOutdated){ //100402 msgString = NSLocalizedString(@"YUQ_Activity_Err_ActivityOutdated", nil); } else if(code == ErrorTypeErrorActivityMustBeCar){ //100403 msgString = NSLocalizedString(@"YUQ_Activity_Err_ActivityMustBeCar", nil); } else if(code == ErrorTypeErrorGroupMembersOnly){ //100404 msgString = NSLocalizedString(@"YUQ_Activity_Err_GroupMembersOnly", nil); } else { if (!msgString || [msgString isKindOfClass:[NSNull class]]) { return [self networkError]; } } NSError *error = [NSError errorWithDomain:YUQ_BASE_URL_STR code:code userInfo:@{NSLocalizedDescriptionKey:msgString}]; return error;}
还用到了配置文件:YUQService
YUQService.h
//url配置+ (NSDictionary *)urlConfigs;//需要签名的请求+ (NSString *)commonPartCombineURLString:(NSString *)URLstring andParams:(NSDictionary *)params isGET:(BOOL)isGET;//GET方法直接拼接需要的参数;POST方法,参数放在post的params里+ (NSString *)commonPartCombineURLString:(NSString *)URLstring andParams:(NSDictionary *)params isGET:(BOOL)isGET needSign:(BOOL)need;//调用网络接口,签名使用排序后的加密字符+ (NSString *)signWithParams:(NSDictionary *)params;+ (NSString *)appVersion;
YUQService.m
#define PATH_IN_DOCUMENTS_DIR(f) ([NSString stringWithFormat:@"%@/Documents/%@", NSHomeDirectory(),f])#define kURLConfigsFile @"YUQURLConfigs.plist"#define APP_ID @"111"static NSDictionary *_urlConfigs = nil;//url配置+ (NSDictionary *)urlConfigs{ if (!_urlConfigs) { _urlConfigs = [NSDictionary dictionaryWithContentsOfFile:PATH_IN_DOCUMENTS_DIR(kURLConfigsFile)]; } return _urlConfigs;}//需要签名的请求+ (NSString *)commonPartCombineURLString:(NSString *)URLstring andParams:(NSDictionary *)params isGET:(BOOL)isGET{ return [YUQService commonPartCombineURLString:URLstring andParams:params isGET:isGET needSign:YES];}//GET方法直接拼接需要的参数;POST方法,参数放在post的params里+ (NSString *)commonPartCombineURLString:(NSString *)URLstring andParams:(NSDictionary *)params isGET:(BOOL)isGET needSign:(BOOL)need{ if (!URLstring) { return nil; } NSRange actionRange = [URLstring rangeOfString:@"?"]; if (actionRange.location > URLstring.length || actionRange.length > URLstring.length) { return nil; } NSString *actionUrlStr = [[[URLstring substringFromIndex:actionRange.location+1] componentsSeparatedByString:@"="] lastObject]; NSMutableString *url = [NSMutableString stringWithString:URLstring]; if (need) { NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:params]; [dic setObject:actionUrlStr forKey:@"action"]; NSString *sign = [YUQService signWithParams:dic]; [url appendFormat:@"&%@=%@&%@=%@&%@=%@&%@=%@", @"app_id", APP_ID, @"sign", sign, @"user_id", [YUQUser currentUser].user_id, @"ver", [YUQService appVersion]]; } else { NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:params]; [dic setObject:actionUrlStr forKey:@"action"]; [url appendFormat:@"&%@=%@&%@=%@", @"app_id", APP_ID, @"ver", [YUQService appVersion]]; } if (isGET) { NSArray *allKeys = [params allKeys]; for (NSString *key in allKeys) { [url appendFormat:@"&%@=%@", key, [params objectForKey:key]]; } } return url;}//调用网络接口,签名使用排序后的加密字符+ (NSString *)signWithParams:(NSDictionary *)params{ NSMutableDictionary *signDic = [NSMutableDictionary dictionaryWithDictionary:params]; if ([YUQUser currentUser].user_id)//容错 { [signDic setObject:[YUQUser currentUser].user_id forKey:@"user_id"]; } [signDic setObject:APP_ID forKey:@"app_id"]; [signDic setObject:[NSString stringWithFormat:@"%@",[YUQService appVersion]]forKey:@"ver"]; NSArray *allSortedKeys = [[signDic allKeys] sortedArrayUsingSelector:@selector(compare:)]; NSMutableString *sign = [NSMutableString stringWithString:@""]; NSString *firstKey = [allSortedKeys objectAtIndex:0]; [sign appendFormat:@"%@=%@", firstKey, [signDic objectForKey:firstKey]]; for (int i = 1; i < allSortedKeys.count; i++) { NSString *key = [allSortedKeys objectAtIndex:i]; id value = [signDic objectForKey:key]; if ([value isKindOfClass:[NSNull class]]) { continue; } if ([value isKindOfClass:[NSString class]]) { if ([(NSString *)value length] < 1) { continue; } } [sign appendFormat:@"&%@=%@", key, value]; } NSString *token = [YUQUser currentUser].token; if (token.length > 0) { [sign appendFormat:@"%@", token]; } NSString *md5Str = @""; //md5加密,此处没有配置参数 // md5Str = [sign md5]; return md5Str; }+ (NSString *)appVersion{ return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];}
其中:
//url配置+ (NSDictionary *)urlConfigs{ if (!_urlConfigs) { _urlConfigs = [NSDictionary dictionaryWithContentsOfFile:PATH_IN_DOCUMENTS_DIR(kURLConfigsFile)]; } return _urlConfigs;}可以配置plist中的url链接
.plist .pch 文件都需要自己建立
0 0
- HTTP 网络请求一般格式 YUQNetwork
- HTTP网络请求原理 (二) Http报文格式解析
- HTTP请求报文格式
- Http请求报文格式
- HTTP请求消息格式
- HTTP请求格式
- HTTP请求消息格式
- HTTP请求报文格式
- HTTP请求格式
- HTTP请求报文格式
- HTTP请求格式
- Http请求格式
- HTTP请求协议格式
- json格式请求http
- Http请求格式
- http 请求格式
- HTTP请求格式和http响应格式
- HTTP请求格式和http响应格式
- Linux内核分析:实验四--使用嵌入汇编系统调用
- AFNetworking - 解决办法
- 快速排序法算法巧解
- iOS基础之文件读写
- {小结}USACO NOV06
- HTTP 网络请求一般格式 YUQNetwork
- java第五节-类,对象,构造方法,静态-static,封装
- 用PriorityQueue解决选择最小的K个数问题
- (2)排序算法——插入排序
- 计算机网络-TCP/IP协议相关知识点
- 第36讲项目5——有多少符号
- ZOJ 3620 Escape Time II【dfs】
- 关于FMDB的基本使用
- 11.投票系统(3)