网络请求:POST/GET

1,GET/POST请求区别。

GET:get请求的参数拼接在url地址后面,而url地址的长度是有限制的,所以get请求请求的数据长度有限,一般用户数据量比较小的请求:(页面跳转等操作等)。虽然登录操作的数据量也非常小,但是因为get参数的url地址栏中,登录密码等信息会直接暴露出来,所以登录操作的密码即使加密,也会使用post请求来完成。
POST:弥补了get请求的明文,数据量小的缺陷。

2,同步/异步请求的区别

同步:同步请求会直接在主线程中进行操作。主线程一般做界面刷新等操作,然而同步请求会导致界面卡死,用户体验很差,所以在请求数据时,一般使用异步请求。用到同步请求时 ,一般是在开始界面,如果在app的首页要有数据请求,可以使用同步请求,让界面卡死在开始界面,当数据请求完成后,再进入到首页,防止数据还未请求完成就跳转到首页,用户体验不好。
异步请求:异步请求会单开一个线程,所以不会阻塞主线程,界面不会卡死。

3,四种网络请求方式:(GET同步,GET异步,POST同步,POST异步)

1)GET同步请求
/**
 *  发起GET同步请求
 *
 *  @param method     网络请求地址
 *  @param parameters 参数
 *  @param callback   回调方法
 */
- (void)sendGetSynchronizeRequestWithMethod:(NSString *)method parameters:(NSDictionary *)parameters callback:(Callback)callback {
    
    // 发起请求
    NSError *error = nil;
    // 配置get请求参数(configGetUrlRequestWithMethod方法将在后面介绍) 、接收请求返回数据
    NSData *data = [NSURLConnection sendSynchronousRequest:[self configGetUrlRequestWithMethod:method parameters:parameters] returningResponse:nil error:&error];

    if (error) {
        // 如果出错,就输出错误,并回调
        NSLog(@"request did failed with error message '%@'", [error localizedDescription]);
        callback(error, nil);
    } else {
        // JSON解析,回调
        NSMutableDictionary *object = [selfJSONObjectWithData:data];
        callback(nil, object);
    }
}
2)GET异步请求

GET异步请求需要实现NSURLConnectionDataDelegate代理方法
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; // 接收到数据
- (void)connectionDidFinishLoading:(NSURLConnection *)connection; // 加载完成(数据全部接受完)
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; // 网络请求
发起GET异步请求
/**
 *  发起GET异步请求
 *
 *  @param method     网络请求地址
 *  @param parameters 参数
 *  @param callback   回调方法
 */
- (void)sendGetAsynchronizeRequestWithMethod:(NSString *)method parameters:(NSDictionary *)parameters callback:(Callback)callback {
    
    self.callback = callback;
 // 配置get请求参数(configGetUrlRequestWithMethod方法将在后面介绍) 、接收请求返回数据
    [NSURLConnection connectionWithRequest:[self configPostURLRequestWithMethod:method parameters:parameters] delegate:self];
}

代理方法实现

/**
 *  接收到数据时的代理
 *
 *  @param connection 网络连接
 *  @param data       接收到的数据
 */
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    
    if (!_responseData) {
        
        _responseData = [[NSMutableData alloc] init];
    }
    
    // 在数据量较大时,会多次走这个方法,接收数据,需要将每次接收到的数据拼接起来
    [_responseData appendData:data];
 }

/**
 *  请求完成代理
 *
 *  @param connection 网络连接
 */
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    
    // 关闭网络连接
    [connection cancel];
    
    // JSON解析
    id object = [self JSONObjectWithData:_responseData];
    
    // 将接收数据的参数赋空,用于下次请求继续接收新的数据
    _responseData.length = 0;
    
    // 如果有回调方法,则走回调方法
    if (_callback) {
        
        _callback(nil, object);
    }
    // 释放回调方法
    self.callback = nil;
 }

/**
 *  请求出错代理
 *
 *  @param connection 网络连接
 *  @param error      错误
 */
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    
    // 关闭网络连接
    [connection cancel];
    
    // 如果有回调方法,则走回调方法
    if (_callback) {
        
        _callback(error, nil);
    }
    // 释放回调方法
    self.callback = nil;
}
3),GET请求参数配置:将GET请求的参数拼接在url之后
/**
 *  配置GET请求
 *
 *  @param method     网络请求地址
 *  @param parameters 参数
 *
 *  @return配置完成的请求
 */
- (NSURLRequest *)configGetUrlRequestWithMethod:(NSString *)method parameters:(NSDictionary *)parameters {
    
    // 因为GET的参数是拼接在URL地址后面的,所以将method参数copy为可变字符串
    NSMutableString *httpBodyString = [method mutableCopy];
    
    // GET请求的URL地址在参数前,需要加上?,表示参数列表开始
    [httpBodyString appendString:@"?"];
    
    // 循环将参数拼接到URL后面
    for (NSString *key in parameters) {

        [httpBodyString appendFormat:@"%@=%@&", key, [parameters objectForKey:key]];
    }
    
    // 将string转为URL
    NSURL *url = [NSURL URLWithString:httpBodyString];
    //通过url生成网络请求
    return [NSURLRequest requestWithURL:url];
}
4),请求完成后,JSON数据解析
/**
 *  JSON解析返回数据
 *
 *  @param data 返回的数据
 *
 *  @return解析为JSON对象
 */
- (id)JSONObjectWithData:(NSData *)data {
    
    // 如果没有数据返回,则直接不解析
    if (data.length == 0) {
        
        return nil;
    }
    
    // 初始化解析错误
    NSError *error = nil;
    
    // JSON解析
    id object = [NSJSONSerializationJSONObjectWithData:data options:NSJSONReadingMutableLeaves error:&error];
    return object;
 }
5).POST同步请求
/**
 *  发起POST同步请求
 *
 *  @param method     网络请求地址
 *  @param parameters 参数
 *  @param callback   回调方法
 */
- (void)sendPostSynchronizeRequestWithMethod:(NSString *)method parameters:(NSDictionary *)parameters callback:(Callback)callback {
    
    // 发起请求
    NSError *error = nil;
    // post参数配置(configPostURLRequestWithMethod会在后面介绍) 接收请求返回的数据
    NSData *data = [NSURLConnection sendSynchronousRequest:[self configPostURLRequestWithMethod:method parameters:parameters] returningResponse:nil error:&error];
    
    if (error) {
        
        // 如果出错,就输出错误,并回调
        NSLog(@"request did failed with error message '%@'", [error localizedDescription]);
        callback(error, nil);
    } else {
        
        // JSON解析,回调
        NSMutableDictionary *object = [selfJSONObjectWithData:data];
        callback(nil, object);
    }
}
6).POST异步请求

/**
 *  发起POST异步请求
 *
 *  @param method     网络请求地址
 *  @param parameters 参数
 *  @param callback   回调方法
 */
- (void)sendPostAsynchronizeRequestWithMethod:(NSString *)method parameters:(NSDictionary *)parameters callback:(Callback)callback {
    
    self.callback = callback;
    
    [NSURLConnection connectionWithRequest:[self configPostURLRequestWithMethod:method parameters:parameters] delegate:self];
}
7),POST请求参数配置

/**
 *  配置POST请求
 *
 *  @param method     网络请求地址
 *  @param parameters 参数
 *
 *  @return配置完成的请求
 */
- (NSURLRequest *)configPostURLRequestWithMethod:(NSString *)method parameters:(NSDictionary *)parameters {
    
    // POST请求的参数是放在httpbody中的,所以可以先将请求地址转为url
    NSURL *url = [NSURLURLWithString:method];
    // 需要不停地拼接参数,所以request需要是可变的
    NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:url];
    // 配置请求方法
    request.HTTPMethod = @"POST";
    // 请求超时时长
    request.timeoutInterval = 10;
    
    // 配置请求参数
    NSMutableString *httpBodyString = [NSMutableStringstring];
    for (NSString *key in parameters) {
        
        [httpBodyString appendFormat:@"%@=%@&", key, [parameters objectForKey:key]];
    }
    // 将参数加在httpbody中
    request.HTTPBody = [httpBodyString dataUsingEncoding:NSUTF8StringEncoding];
    
    return request;
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,398评论 25 707
  • 一、需要用的知识点 1、GET/POST请求区别: GET: get请求的参数拼接在url地址后面,而URL地址的...
    陪你看日出去阅读 1,419评论 1 4
  • 看到《疯犬少年的天空》这本书的时候,猜测这是一本讲述青春期少年时代的书籍,关于中二、关于叛逆、关于自我,可我没想到...
    藤藤啊阅读 449评论 0 1
  • 恍恍惚惚,毕业也两年多了。闲暇的时候,我们总是在抱怨时间太快,生活太忙,正值青春,却没有去放肆浪,时间可不等人,隐...
    轻言卿语阅读 415评论 5 0