NSURLSession的GET和POST请求的封装

简介:因为在iOS9.0之后,以前使用的NSURLConnection过期,苹果推荐使用NSURLSession来替换NSURLConnection完成网路请求相关操作。

之前已经在   http://www.linuxidc.com/Linux/2016-04/129797.htm 介绍如何使用NSURLSession来发送GET请求和POST请求。

这里会将其封装起来,方便以后可以通过一个方法实现所有过程。

基本思路:

  1.创建一个继承自NSObject的自定义类,用来调用封装的POST和GET方法

  2.在自定义类里面创建单例对象创建方法:

+(instancetype)sharedNewtWorkTool
{
    static id _instance;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[self alloc] init];
    });
    return _instance;
}

  3.封装方法参数说明:

      (1)urlString:登录接口字符串

     (2)paramaters:请求参数字典   key:服务器提供的接收参数的key. value:参数内容

     (3)typedef void(^SuccessBlock)(id object , NSURLResponse *response):成功后回调的block :参数: 1. id: object(如果是 JSON ,那么直接解析     成OC中的数组或者字典.如果不是JSON ,直接返回 NSData) 2. NSURLResponse: 响应头信息,主要是对服务器端的描述

     (4)typedef void(^failBlock)(NSError *error):失败后回调的block:参数: 1.error:错误信息,如果请求失败,则error有值

GET请求方法封装:

-(void)GETRequestWithUrl:(NSString *)urlString paramaters:(NSMutableDictionary *)paramaters successBlock:(SuccessBlock)success FailBlock:(failBlock)fail

{

// 1. 创建请求.

// 参数拼接.

// 遍历参数字典,一一取出参数,按照参数格式拼接在 url 后面.

NSMutableString *strM = [[NSMutableString alloc] init];

[paramaters enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key,
id  _Nonnull obj, BOOL * _Nonnull stop) {

// 服务器接收参数的 key 值.

NSString *paramaterKey = key;

// 参数内容

NSString *paramaterValue = obj;

// appendFormat :可变字符串直接拼接的方法!

[strM appendFormat:@"%@=%@&",paramaterKey,paramaterValue];

}];

urlString = [NSString stringWithFormat:@"%@?%@",urlString,strM];

// 截取字符串的方法!

urlString = [urlString substringToIndex:urlString.length -
1];

NSLog(@"urlString:%@",urlString);

NSURL *url = [NSURL URLWithString:urlString];

NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:15];

// 2. 发送网络请求.

// completionHandler: 说明网络请求完成!

[[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);

// 网络请求成功:

if (data && !error) {

// 查看 data 是否是 JSON 数据.

// JSON 解析.

id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];

// 如果 obj 能够解析,说明就是 JSON

if (!obj) {

obj = data;

}

// 成功回调

dispatch_async(dispatch_get_main_queue(), ^{

if (success) {

success(obj,response);

}

});

}else
//失败

{

// 失败回调

if (fail) {

fail(error);

}

}

}] resume];

}

POST请求方法封装:

-(void)POSTRequestWithUrl:(NSString *)urlString paramaters:(NSMutableDictionary *)paramaters successBlock:(SuccessBlock)success FailBlock:(failBlock)fail
{
    // 1. 创建请求.

    // 参数拼接.
    // 遍历参数字典,一一取出参数

    NSMutableString *strM = [[NSMutableString alloc] init];

    [paramaters enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {

        // 服务器接收参数的 key 值.
        NSString *paramaterKey = key;

        // 参数内容
        NSString *paramaterValue = obj;

        // appendFormat :可变字符串直接拼接的方法!
        [strM appendFormat:@"%@=%@&",paramaterKey,paramaterValue];
    }];

    NSString *body = [strM substringToIndex:strM.length - 1];

    NSLog(@"%@",body);

    NSData *bodyData = [body dataUsingEncoding:NSUTF8StringEncoding];

    NSURL *url = [NSURL URLWithString:urlString];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:15];

    // 1.设置请求方法:
    request.HTTPMethod = @"POST";

    // 2.设置请求体
    request.HTTPBody = bodyData;

    // 2. 发送网络请求.
    // completionHandler: 说明网络请求完成!
    [[[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {

        NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);

        // 网络请求成功:
        if (data && !error) {

            // 查看 data 是否是 JSON 数据.

            // JSON 解析.
            id obj = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];

            // 如果 obj 能够解析,说明就是 JSON
            if (!obj) {
                obj = data;
            }

            // 成功回调
            dispatch_async(dispatch_get_main_queue(), ^{

                if (success) {
                    success(obj,response);
                }
            });

        }else //失败
        {
            // 失败回调
            if (fail) {
                fail(error);
            }
        }

    }] resume];

}

自定义类算是粗略的完成了,接下来就是检验成果的时候:

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

NSLog(@"touchesBegan");

//创建参数字典

NSMutableDictionary *dict = @{@"username":@"zhangsan",@"password":@"zhang"}.mutableCopy;

// 一句话发送 GET 请求.

[[CZNetworkTool sharedNewtWorkTool] GETRequestWithUrl:@"http://127.0.0.1/login/login.php" paramaters:dict successBlock:^(id
object, NSURLResponse *response) {

NSLog(@"网络请求成功:%@",object);

} FailBlock:^(NSError *error) {

NSLog(@"网络请求失败");

}];

}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    NSLog(@"touchesBegan");

    //创建参数字典
    NSMutableDictionary *dict = @{@"username":@"zhangsan",@"password":@"zhang"}.mutableCopy;

    // 一句话发送 GET 请求.
    [[CZNetworkTool sharedNewtWorkTool] POSTRequestWithUrl:@"http://127.0.0.1/login/login.php" paramaters:dict successBlock:^(id object, NSURLResponse *response) {

        NSLog(@"网络请求成功:%@",object);

    } FailBlock:^(NSError *error) {

        NSLog(@"网络请求失败");

    }];

}

代码执行结果:

成功!

时间: 2024-10-03 18:22:18

NSURLSession的GET和POST请求的封装的相关文章

使用NSURLConnection的网络请求与封装

访问网络的方式: 1.同步请求: 会阻塞主线程 2.异步请求: 无法取消 请求过程在多线程执行 基本流程: 1.构造NSURL实例. 2.生成NSURLRequest请求. 3.通过NSURLConnection发送请求. 4.通过NSURLRespond实例和NSError实例分析结果. 5.接受返回数据. 使用NSURLConnection发起异步请求: 第一种方法: - (void)setUrl:(NSURL *)url { //使用同异步请求网络 NSMutableURLRequest

javascript中Ajax请求的封装代码

/****************************ajax请求 start**************************************/ function ajaxClass(_url, _successCallback, _failureCallback, _urlParameters, _callbackParams, _async, _charset, _timeout, _frequency, _requestTimes, _frame) { /** * AJAX

小程序api请求层封装(Loading全局配置)

前言 小程序开发,没有vue中的axios那么好使,请求层的封装需要自己来搞. 当然请求层的配置少不了loading,这里索性也就将loading做一个配置,避免以后重复造轮子 请求封装 小程序中有封装好的请求方法:wx.request(url,method,header,success,fail,complete);方法类似于原生的ajax, 这里我们大的方面分两种,一种普通请求,一种是文件上传 普通请求又分为get请求,post请求,post请求又分为JSON格式和BODY格式因此 我们需要

http请求的封装与过滤

最近做的净水器项目,前台需要对发送的请求进行统一的封装,后台需要对请求进行统一的验证.本文记录了前台进行的http请求的封装及后台进行的http请求的过滤.前台:小程序,后台:SpringMvc. 小程序对http请求进行封装 在微信小程序wx.request官网 中的http请求是这样的: 1 2 3 4 5 6 7 8 9 10 11 12 13 wx.request({ url: 'test.php', data: { x: '' , y: '' }, header: { 'content

Drf04 / drf request请求对象封装、版本、认证、权限

目录 Drf04 / drf request请求对象封装.版本.认证.权限 回顾和补充 今日详细 1.请求的封装 2.版本 3.认证(面试) 4.权限 Drf04 / drf request请求对象封装.版本.认证.权限 回顾和补充 restful规范 1. 建议用https代替http 2. 在URL中体现api,添加api标识 https://www.cnblogs.com/xwgblog/p/11812244.html # 错误 https://www.cnblogs.com/api/xw

axios请求方法封装.

axios的使用上一般封装好对应的方法,ES6导出,直接调用,消息通知使用了ElementUI的Message组件. 这是一个封装了axios的Rest风格的工具类,包扩常用的POST,GET,PUT,DELETE, 在请求处理上使用统一的请求拦截处理.对返回的消息进行拦截预处理,有数据返回数据,没有返回消息. import axios from 'axios' import router from '../router' import { Message } from 'element-ui'

原生js和jquery发送ajax请求及封装

原生js                                   // ajax get 五部曲function ajax_get(url,data){ // 异步对象 var ajax=new XMLHttpRequest(); // 设置url和请求方式 // url方法 如果有数据要把数据拼接到url中?name=jack&age=20 if(data){ url+=?; url+=data; }else{}; ajax.open('get',url); // 发送请求 aja

网络请求的封装

网络封装的原因: 开发者为了开发方便,出现了大量的第三方的网络请求,我们除了在cocoapods中引入第三方的开源,同时还应该注意的一点是:如果第三方的网络请求不更新了(比如ASI),或者网络请求工具类在新版本出现了bug导致暂时无法使用,我们工程中存在大量的网络请求,可能会导致我们工程无法运行,甚至导致工程需要重新走通,为了这种解决这种突发状况的产生,我们需要在网络请求之前,进行简单的封装: 这里我们以AFNetworking为例 HttpTool.h中: #import <Foundatio

通用ajax请求方法封装,兼容主流浏览器

ajax简介 没有AJAX会怎么样?普通的ASP.Net每次执行服务端方法的时候都要刷新当前页面.如果没有AJAX,在youku看视频的过程中如果点击了"顶.踩".评论.评论翻页,页面就会刷新,视频就会被打断.开发一个看效果:用<video src="diaosi.mp4" autoplay controls></video>播放视频(只有支持html5的浏览器能播放),然后放一个"赞"按钮的功能(赞的数量存到数据库),看