(十)网络请求的基本封装

网络请求的封装

设置开发环境与生产环境的地址开关,结合AFNetworking进行封装,我直接用我以前实现的代码先大致说明下实现后的效果。

这里写图片描述

  1. 上图的简单流程便是,根据返回后的数据是array类型还是一个字典类型来选择不同的方法
  2. 请求的地址
  3. 上传服务器时和服务器方协定的一些加密请求规则,这个根据公司情况决定是否要添加,我后面举例就暂时不添加了。
  4. 上传服务器需要传递的参数
  5. 获得的服务器数据转换为的model类型
  6. 将转化的model数据指向本地的一个对应属性
  7. 完成网络请求成功或失败的操作
    现在我通过新浪的一个ip地址信息查询接口来进行下演示。
http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=218.4.255.255

以此接口我们设定服务器方给我们的基本地址是http://int.dpool.sina.com.cn,这个地址是生产环境的,如果需要改为开发环境也就是说只改这个地址即可,后面跟着的地址参数等无需变动
iplookup/iplookup.php可作为请求数据的地址参数
format=json&ip=218.4.255.255 可作为请求的两个参数
所以我们先简单实现.h文件的设置

#import <Foundation/Foundation.h>
#import "AFNetworking.h"
#import "BaseModel.h"
@interface WebServiceHelper : NSObject


//新浪的ip获取地址
//http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=218.4.255.255
// 0 - 正式服 1 - 测试服
#define DEBUGMODE 0

#if DEBUGMODE
#define kHTTPREQUEST_BASE_URL           @"http://int.dpool.sina.com.cn"//测试环境
#else
#define kHTTPREQUEST_BASE_URL            @"http://int.dpool.sina.com.cn"//生成环境网络请求
#endif


#pragma mark --------------------------------返回带有对象控制权的model数据---------------
/**
 *  请求带有对象控制器的字典Model
 *
 *  @param url           地址
 *  @param parameters    上传的参数
 *  @param modelClass    Model类型
 *  @param requester     对象所有者
 *  @param key           属性名
 *  @param success       成功返回字典Model数据
 *  @param failure       失败
 */
+ (void)postAndGetJsonModelWithURLString:(NSString *)url
                              parameters:(NSDictionary *)parameters
                              modelClass:(Class)modelClass
                               requester:(id)requester
                                     key:(NSString *)key
                                 success:(void (^)(BaseModel *baseModel))success
                                 failure:(void (^)(NSError *error))failure;



@end

关于.m的实现我就不一一解释了,详情看代码

#import "WebServiceHelper.h"
#define CustomErrorDomain @"com.WebServiceHelper"
typedef enum
{

    PARAMETER_ERROR = 0,//参数错误
    EXCEPTION_DESCRIPTION, //网络错误
    INTERFACE_CHECKFAIL,//接口验证失败
    BC_CODEFAIL//渠道码不存在

}CustomErrorFailed;// 用于表示错误类型


@implementation WebServiceHelper
#pragma mark 请求最基本数据
+(void)postWithURLString:(NSString *)url
              parameters:(NSDictionary *)parameters
                 success:(void (^)(id))success
                 failure:(void (^)(NSError *))failure
{

    NSString *postUrl = [NSString stringWithFormat:@"%@/%@",kHTTPREQUEST_BASE_URL,url];

    //需要提交的参数(原参数加加密验证的数据)
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/json"];
    manager.requestSerializer.timeoutInterval = 30;

    //因为这个测试的地址需要用GET方法获取,所以这里我先用GET的方法调用了
    [manager GET:postUrl parameters:parameters progress:^(NSProgress * _Nonnull uploadProgress) {
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject)
     {
         if (success)
         {
             success(responseObject);

         }

     } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
         if (failure) {

             failure(error);
         }
     }];

}



#pragma mark ------------------------------请求model数据--------------------------
#pragma mark 请求model数据
+ (void)postAndGetJsonModelWithURLString:(NSString *)url
                              parameters:(NSDictionary *)parameters
                              modelClass:(Class)modelClass
                                 success:(void (^)(BaseModel *baseModel))success
                                 failure:(void (^)(NSError *error))failure
{
    // 检查需要返回的model类型是否存在
    if (modelClass == nil)
    {
        if (failure != nil)
        {
            NSDictionary *userInfo = [NSDictionary dictionaryWithObject:@"is a parameter error"                                                                      forKey:NSLocalizedDescriptionKey];
            NSError *aError = [NSError errorWithDomain:CustomErrorDomain code:PARAMETER_ERROR userInfo:userInfo];
            failure(aError);
            NSLog(@"\n\nmodelClass参数 == nil\n\n");
        }
        return ;
    }


    [WebServiceHelper postWithURLString:url parameters:parameters success:^(id responseObject) {
        // 检查data
        if (![responseObject isKindOfClass:[NSDictionary class]])
        {
            NSLog(@"\n\njsonModelRequestWithInfo请求的数据不是字典类型: data is invalid\n\n");
            NSDictionary *userInfo = [NSDictionary dictionaryWithObject:@"数据不是字典类型"                                                                      forKey:NSLocalizedDescriptionKey];
            NSError *aError = [NSError errorWithDomain:CustomErrorDomain code:PARAMETER_ERROR userInfo:userInfo];
            failure(aError);

        }
        else
        {
            // 正常返回
            BaseModel *baseModel = [[modelClass alloc] initWithDataDic:responseObject];
            if (success != nil)
            {
                success(baseModel);
            }
        }

    } failure:^(NSError *error) {
        failure(error);
    }];


}


#pragma mark ------------------------------请求有对象所有选的model数据--------------------------
#pragma mark 请求有对象所有选的model数据
+ (void)postAndGetJsonModelWithURLString:(NSString *)url
                              parameters:(NSDictionary *)parameters
                              modelClass:(Class)modelClass
                               requester:(id)requester
                                     key:(NSString *)key
                                 success:(void (^)(BaseModel *baseModel))success
                                 failure:(void (^)(NSError *error))failure
{
    // 检查实参
    if (requester == nil || key == nil)
    {
        if (failure != nil)
        {
            NSDictionary *userInfo = [NSDictionary dictionaryWithObject:@"请求的参数requester == nil, or key ==nil"                                                                      forKey:NSLocalizedDescriptionKey];
            NSError *aError = [NSError errorWithDomain:CustomErrorDomain code:PARAMETER_ERROR userInfo:userInfo];
            failure(aError);

        }
        return ;
    }


    [WebServiceHelper postAndGetJsonModelWithURLString:url parameters:parameters modelClass:modelClass success:^(BaseModel *baseModel) {
        //kvo设置属性值
        [requester setValue:baseModel forKey:key];
        if (success != nil) {
            success(baseModel);
        }
    } failure:^(NSError *error) {
        if (error != nil) {

            //            //如果网络请求失败,则调用一下pageNum的值减1,防止pullUp失败时也会让pageNum加1
            //            if ([requester isKindOfClass:[BaseViewController class]]) {
            //                [requester reducePageNum];
            //            }
            failure(error);
        }
    }];
}

@end

实现网络请求

  1. 第一创建对应的model为FriendIPModel

    这里写图片描述

  2. model数据中添加返回数据的所有属性

  3. 在控制器中添加一个FriendIPModel的对象属性

这里写图片描述

  1. 开始网络请求
#import "FriendViewController.h"
#import "FriendIPModel.h"
@interface FriendViewController ()
@property (nonatomic,strong)FriendIPModel *friendModel;
@property (weak, nonatomic) IBOutlet UITextField *textFied;
@property (weak, nonatomic) IBOutlet UITextView *containTextV;


@end

@implementation FriendViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.title = @"好友";


}

#pragma mark ---------Actions--------

- (IBAction)resetAction {
    self.textFied.text = @"53.223.108.40";
    self.containTextV.text = @"";
    [self.textFied resignFirstResponder];
}

- (IBAction)searcheAction {
    [self requestData];
     self.containTextV.text = @"";
    [self.textFied resignFirstResponder];
}



#pragma mark 请求网路
- (void)requestData
{
    [super requestData];
    NSMutableDictionary *muDic = [NSMutableDictionary dictionary];
    [muDic setObject:self.textFied.text forKey:@"ip"];
    [muDic setObject:@"json" forKey:@"format"];

    //key值必须和上面定义的属性名一致
    [WebServiceHelper postAndGetJsonModelWithURLString:@"iplookup/iplookup.php" parameters:muDic modelClass:[FriendIPModel class] requester:self key:@"friendModel" success:^(BaseModel *baseModel) {
        [self requestSuccess];
        self.containTextV.text = self.friendModel.country;
    } failure:^(NSError *error) {
        self.isLoading = NO;
        self.containTextV.text = @"请求数据错误";
    }];


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值