post请求使用方法
get请求使用方法
注意事项
=================================
下面是
Request.h 封装了请求,可以直接拿来用的
//
// Request.h
// 咚咚API
//
// Created by 陆巧怡 on 15/6/30.
// Copyright (c) 2015年 Simon. All rights reserved.
//
@protocol RequestDelegate <NSObject>
/**
* 网络请求成功返回的数据
*
* @param responseObject 请求成功返回的数据
* @param requestName 请求的名字
*/
-(void)requestFinish:(id)responseObject requestName:(NSString *)requestName;
/**
* 网络请求失败返回的数据
*
* @param error 请求失败返回的数据
* @param requestName 请求的名字
*/
-(void)requestError:(NSError *)error requestName:(NSString *)requestName;
@end
#import "AFHTTPSessionManager.h"
#import <AFHTTPSessionManager.h>
@interface Request : AFHTTPSessionManager
@property (nonatomic, strong) NSMutableDictionary *configRequsetData;
@property (nonatomic, weak) id<RequestDelegate> delegate;
/**
* Get 取得数据
*
* @param parameters 参数
* @param requestName 请求方法的名字
*/
- (void)getData:(NSMutableDictionary *)parameters requestName:(NSString *)requestName;
/**
* Post 提交数据
*
* @param parameters 参数
* @param requestName 请求方法的名字
*/
- (void)postData:(NSMutableDictionary *)parameters requestName:(NSString *)requestName;
/**
* Post 提交数据,包含了图片数据
*
* @param parameters 参数
* @param requestName 请求方法的名字
*/-(void)postImageData:(NSMutableDictionary *)parameters requestName:(NSString *)requestName;
@end
//
// Request.m
// 咚咚API
//
// Created by 陆巧怡 on 15/6/30.
// Copyright (c) 2015年 Simon. All rights reserved.
//
#import "Request.h"
@implementation Request
- (id)init
{
self = [super initWithBaseURL:[NSURL URLWithString:API_URL]];
if (self) {
// 得到的是二进制
self.responseSerializer = [AFHTTPResponseSerializer serializer];
//设置 设置为60s超时:请求时间超过60s会被认为连接不上,连接超时
self.requestSerializer.timeoutInterval = 60;
//[self settingConfigRequestData];
}
return self;
}
#pragma mark ========== Get请求 取得数据 ============
/**
* Get 取得数据
*
* @param parameters 参数
* @param requestName 请求方法的名字
*/
- (void)getData:(NSMutableDictionary *)parameters requestName:(NSString *)requestName {
//添加参数
NSString *apiName = parameters[@"api"];
[parameters removeObjectForKey:@"api"];
[self GET:apiName parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {
// HTML 需要转码
NSMutableDictionary *responseData = [NSJSONSerialization JSONObjectWithData:responseObject options:kNilOptions error:nil];
[self.delegate requestFinish:responseData requestName:requestName];
} failure:^(NSURLSessionDataTask *task, NSError *error) {
[self.delegate requestError:error requestName:requestName];
}];
}
#pragma mark ========== post请求 取得数据 ============
/**
* Post 取得数据
*
* @param parameters 参数
* @param requestName 请求方法的名字
*/
-(void)postData:(NSMutableDictionary *)parameters requestName:(NSString *)requestName{
//添加参数
NSString *apiName = parameters[@"api"];
[parameters removeObjectForKey:@"api"];
[self POST:apiName parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {
// HTML 需要转码
NSMutableDictionary *responseData = [NSJSONSerialization JSONObjectWithData:responseObject options:kNilOptions error:nil];
[self.delegate requestFinish:responseData requestName:requestName];
} failure:^(NSURLSessionDataTask *task, NSError *error) {
[self.delegate requestError:error requestName:requestName];
}];
}
#pragma mark ========== post请求包含图片信息 取得数据 ============
-(void)postImageData:(NSMutableDictionary *)parameters requestName:(NSString *)requestName{
//添加参数
NSString *apiName = parameters[@"api"];
[parameters removeObjectForKey:@"api"];
//获取parameters 存储的图片数据
NSMutableDictionary *imageDic = parameters[@"uploadImageData"];
[parameters removeObjectForKey:@"uploadImageList"];
[self POST:apiName parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
//遍历字典,取出图片的数据 然后添加到 formData
for (NSString *key in imageDic) {
NSData *imageData = UIImageJPEGRepresentation(imageDic[key], 1);
[formData appendPartWithFileData:imageData name:key fileName:[NSString stringWithFormat:@"%@.jpg",key] mimeType:@"image/jpeg"];
}
} success:^(NSURLSessionDataTask *task, id responseObject) {
// HTML 需要转码
NSMutableDictionary *responseData = [NSJSONSerialization JSONObjectWithData:responseObject options:kNilOptions error:nil];
[self.delegate requestFinish:responseData requestName:requestName];
} failure:^(NSURLSessionDataTask *task, NSError *error) {
[self.delegate requestError:error requestName:requestName];
}];
}
/**
* 设置默认传送的参数,需要时候在调用。结合需求,就是传固定参数。例如传版本号之类的。
*/
-(void)settingConfigRequestData{
if (!self.configRequsetData) {
self.configRequsetData = [NSMutableDictionary dictionary];
self.configRequsetData[@"version"] = APP_VERSION;
}
}
@end
=================================
Api.h 封装了请求接口,可以直接拿来用的
//
// Api.h
// 咚咚API
//
// Created by 陆巧怡 on 15/7/6.
// Copyright © 2015年 Simon. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Request.h"
@interface Api : NSObject<RequestDelegate>
@property (nonatomic, strong) Request *request;
/**
* 请求成功的数据 以及接口名字
*/
@property (nonatomic, copy) void(^didRequestFinishBlock)(id request,NSString *requestName);
/**
* 请求失败的数据 以及接口名字
*/
@property (nonatomic, copy) void(^didRequestErrorBlock)(NSError *error,NSString *requestName);
/**
* 请求成功或者失败数据返回Block
*
* @param finishData 请求成功的数据 以及接口名字
* @param errorData 请求失败的数据 以及接口名字
*/
-(void)requestFinishData:(void(^)(id responseObject,NSString *requestName))finishData requestError:(void(^)(NSError * error,NSString *requestName))errorData;
//post 请求拿数据
-(void)GetHotgoods:(NSMutableDictionary *)dic;
//get 请求拿数据
-(void)GetProduct:(NSMutableDictionary *)dic;
@end
//
// Api.m
// 咚咚API
//
// Created by 陆巧怡 on 15/7/6.
// Copyright © 2015年 Simon. All rights reserved.
//
/**
Api 是获得数据的接口。调用时候直接写方法就可以。
*/
#import "Api.h"
#import "Request.h"
@implementation Api
- (instancetype)init
{
self = [super init];
if (self) {
[self createData];
}
return self;
}
#pragma mark 初始化数据
-(void)createData{
self.request = [[Request alloc]init];
self.request.delegate = self;
}
#pragma mark dealloc 里面释放。
-(void)dealloc{
self.didRequestErrorBlock = nil;
self.didRequestFinishBlock = nil;
}
#pragma mark Request的代理,数据请求
-(void)requestFinish:(id)responseObject requestName:(NSString *)requestName{
//block 赋值
self.didRequestFinishBlock(responseObject,requestName);
}
-(void)requestError:(NSError *)error requestName:(NSString *)requestName{
//block 赋值
self.didRequestErrorBlock(error,requestName);
}
/**
* 请求成功或者失败数据返回Block
*
* @param finishData 请求成功的数据 以及接口名字
* @param errorData 请求失败的数据 以及接口名字
*/
-(void)requestFinishData:(void(^)(id responseObject,NSString *requestName))finishData requestError:(void(^)(NSError * error,NSString *requestName))errorData{
self.didRequestFinishBlock = finishData;
self.didRequestErrorBlock = errorData;
}
#pragma mark
//post
-(void)GetHotgoods:(NSMutableDictionary *)dic{
dic[@"api"] = @"system/get-brands";
[self.request postData:dic requestName:@"post请求"];
}
//get
-(void)GetProduct:(NSMutableDictionary *)dic{
dic[@"api"] = @"system/getcategory";
[self.request getData:dic requestName:@"get"];
}
@end
=================================
这里是pch文件一些宏定义。以上两个会用到的
//
// PrefixHeader.pch
// 咚咚API
//
// Created by 陆巧怡 on 15/6/25.
// Copyright (c) 2015年 Simon. All rights reserved.
//
#ifndef __API_PrefixHeader_pch
#define __API_PrefixHeader_pch
#import "myTabBarController.h"
// Include any system framework and library headers here that should be included in all compilation units.
// You will also need to set the Prefix Header build setting of one or more of your targets to reference this file.
//配置
#define APP_VERSION [[NSBundle mainBundle] infoDictionary][@"CFBundleShortVersionString"]
#define API_URL @"http://www.haimi.com//api"
#define CreateController(mainViewController,vc,nvc)\
mainViewController * vc = [[mainViewController alloc]init];\
UINavigationController * nvc =[[UINavigationController alloc]initWithRootViewController:vc];
#define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height
#define SCREEN_WDITH [UIScreen mainScreen].bounds.size.width
#define IOS7_OR_LATER ( [[[UIDevice currentDevice] systemVersion] compare:@"7.0"] != NSOrderedAscending )
#define IOS8_OR_LATER ( [[[UIDevice currentDevice] systemVersion] compare:@"8.0"] != NSOrderedAscending )
#define DEVICE_IS_IPHONE5_OR_LATER ([[UIScreen mainScreen] bounds].size.height == 568)
#define STATUS_BAR_HEIGHT 20.0
#define NAV_BAR_HEIGHT 44.0
#define NAVIGATION_BAR_HEIGHT 64.0
#define STATUS_NAV_BAR_HEIGHT 64.0
#define TOOL_BAR_HEIGHT 49.0
#define DESIGN_HEIGHT SCREEN_HEIGHT - NAV_BAR_HEIGHT - STATUS_BAR_HEIGHT - TOOL_BAR_HEIGHT
//判断字符串是否为空
#define IFISNIL(v) (v = (v != nil) ? v : @"")
//判断NSNumber是否为空
#define IFISNILFORNUMBER(v) (v = (v != nil) ? v : [NSNumber numberWithInt:0])
//判断是否是字符串
#define IFISSTR(v) (v = ([v isKindOfClass:[NSString class]]) ? v : [NSString stringWithFormat:@"%@",v])
// 判断设备
#define IS_IPHONE_4 (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)480) < DBL_EPSILON)
#define IS_IPHONE_5 (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)568) < DBL_EPSILON)
#define IS_IPHONE_6 (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)667) < DBL_EPSILON)
#define IS_IPHONE_6_PLUS (fabs((double)[[UIScreen mainScreen]bounds].size.height - (double)736) < DBL_EPSILON)
// Sqlite 数据库名
#define DATABASE_NAME @"lr211.sqlite"
#define LIKE_DATA_PLIST @"LikeData.list"
#define FILL_ZERO(N) N < 10 ? [NSString stringWithFormat:@"0%ld", N] : [NSString stringWithFormat:@"%d", N]
//
// 重新定义 NSLocalizedString
#define LS(str) NSLocalizedString(str, nil)
#define STRING(string) string ? string : @"String Is Nil"
#pragma mark -
#pragma mark -# Masonry
#define MAS_SHORTHAND
#define MAS_SHORTHAND_GLOBALS
#pragma mark -
#pragma mark -# DEBUG
#ifdef DEBUG
# define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
# define DLog(...)
#endif
#endif
=================================
终于到了实现了
//
// ViewController1.m
// 咚咚API
//
// Created by 陆巧怡 on 15/6/25.
// Copyright (c) 2015年 Simon. All rights reserved.
//
#import "ViewController1.h"
#import "FMDBManager.h"
#import "Models.h"
#import "Api.h"
@interface ViewController1 ()
@end
@implementation ViewController1
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
self.api = [[Api alloc]init];
self.dataDic = [NSMutableDictionary dictionary];
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
[button setTitle:@"post请求" forState:UIControlStateNormal];
button.frame = CGRectMake(50, 100, 200, 30);
[button addTarget:self action:@selector(postbuttonAction:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
UIButton *getButton = [UIButton buttonWithType:UIButtonTypeSystem];
[getButton setTitle:@"get请求" forState:UIControlStateNormal];
getButton.frame = CGRectMake(50, 150, 200, 30);
[getButton addTarget:self action:@selector(getbuttonAction:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:getButton];
UIButton *dataButton = [UIButton buttonWithType:UIButtonTypeSystem];
[dataButton setTitle:@"请求后获取数据" forState:UIControlStateNormal];
dataButton.frame = CGRectMake(50, 200, 200, 30);
[dataButton addTarget:self action:@selector(dataButtonAction:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:dataButton];
}
//post
-(void)postbuttonAction:(UIButton *)btn{
DLog(@"post 请求");
NSMutableDictionary *dic =[NSMutableDictionary dictionary];
[dic setObject:@"ANDROID" forKey:@"platform"];
[dic setObject:@"4.2.2" forKey:@"osVersion"];
[dic setObject:@"2.1.1" forKey:@"currentVersion"];
[dic setObject:@"User863990020791016" forKey:@"pushID"];
[dic setObject:@"HM NOTE 1TD" forKey:@"deviceName"];
[dic setObject:@"zh" forKey:@"language"];
[dic setObject:@"haimi" forKey:@"appName"];
[dic setObject:@"863990020791016" forKey:@"deviceID"];
[dic setObject:@"xm" forKey:@"channel"];
[self.api GetHotgoods:dic];
//block回调取得数据
[self.api requestFinishData:^(id responseObject, NSString *requestName) {
self.dataDic = (NSMutableDictionary *)responseObject;
// DLog(@"请求成功的数据%@ --- %@",requestName,responseObject);
} requestError:^(NSError *error, NSString *requestName) {
DLog(@"请求失败的数据%@ --- %@",requestName,error);
}];
}
//get
-(void)getbuttonAction:(UIButton *)btn{
NSMutableDictionary *dic =[NSMutableDictionary dictionary];
[dic setObject:@"ANDROID" forKey:@"platform"];
[dic setObject:@"4.3" forKey:@"osVersion"];
[dic setObject:@"2.1.1" forKey:@"currentVersion"];
[dic setObject:@"User00000000" forKey:@"pushID"];
[dic setObject:@"HM+1SW" forKey:@"deviceName"];
[dic setObject:@"zh" forKey:@"language"];
[dic setObject:@"haimi" forKey:@"appName"];
[dic setObject:@"00000000" forKey:@"deviceID"];
[dic setObject:@"tbzs" forKey:@"channel"];
[self.api GetProduct:dic];
//block回调取得数据
[self.api requestFinishData:^(id responseObject, NSString *requestName) {
DLog(@"请求成功的数据%@ --- %@",requestName,responseObject);
} requestError:^(NSError *error, NSString *requestName) {
DLog(@"请求失败的数据%@ --- %@",requestName,error);
}];
}
-(void)dataButtonAction:(UIButton *)btn{
DLog(@"%@",self.dataDic);
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end