网络请求有GET请求和POST请求,get和post实现的时候可以选择同步或者异步实现.看一个请求是GET还是POST就看网址后面有没有携带请求体.

GET与POST 区别
 1.get请求 请求的网址全部明文显示 安全性不高
 2.get请求 请求的网址 有字符数的限制 大概255个
 3.post请求 请求的网址 不光是有一个请求的网址 还可以携带请求体 这个请求体 是以NSData形式存在 安全性较高
 4.post请求没有字符数的限制
GET同步和GET异步
同步请求是在请求数据的时候不能做其他事情 异步请求在请求数据的时候可以做其他的事.
GET同步请求的步骤
1.创建一个网址对象
  NSString *oldUrl = kSearchURL; 
注意:如果你请求的网址中带有中文 必须进行重新编码
  1. NSString *newUrl = [oldUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

然后把字符串变成一个网址对象

  1. NSURL *url = [NSURL URLWithString:newUrl];

2.发出一个网络请求

  1. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:30.0];

CachePolicy 缓存策略 一般选默认策略  timeoutInterval 请求超时时间  默认就是get请求 如果你要设置的话 需要是可变请求

3.设置请求类型

  1. [request setHTTPMethod:@"GET"];

4.建立链接 接收二进制数据

  1. NSURLResponse *response = nil;
  2. NSError *error = nil;
  3. NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

Response 服务器返回的 描述服务器的数据 error 链接错误信息 如果你不需要 描述服务器的数据和错误信息 可以填nil

然后可以把请求下来得数据转换成json格式

  1. NSMutableDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingMutableContainers) error:nil];
  2. NSLog(@"%@", dataDic);

GET异步请求步骤跟同步请求的前三步都是一样的,区别主要是建立链接

第一步也是创建网址对象 然后利用网址对象创建一个请求类型为GET

GET请求有两种方法 1.代理方法 2.block方法

异步代理方法需要遵守一个协议NSURLConnectionDataDelegate,为了方便使用可以把链接声明成一个属性

NSURLConnection * connection;

  1. self.connection = [NSURLConnection connectionWithRequest:request delegate:self];
开启异步请求
[self.connection start];
具体代码如下:
  1. @interface GetViewController ()<NSURLConnectionDataDelegate, NSURLConnectionDelegate>
  2. // 声明一个可变的 data 用于拼接完整的方法
  3. @property (nonatomic, retain) NSMutableData *data;
  4. // 声明一个链接属性 用于终止网络请求
  5. @property (nonatomic, retain) NSURLConnection *connection;
  6.  
  7. @end
  8.  
  9. @implementation GetViewController
  10. - (void)dealloc
  11. {
  12. // 如果本页面被销毁 那么要终止网络请求
  13. [_connection cancel];
  14. [_data release];
  15. [_connection release];
  16. [super dealloc];
  17. }
  18. #pragma mark NSURLConnectionDataDelegate 4个代理方法
  19. - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
  20. {
  21. // 触发方法 链接成功 初始化 可变data
  22. self.data = [NSMutableData data];
  23. NSLog(@"接收到服务器数组, 说明 链接成功");
  24. }
  25. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
  26. {
  27. // 拼接data
  28. [self.data appendData:data];
  29. NSLog(@"接收数据时触发");
  30. }
  31. - (void)connectionDidFinishLoading:(NSURLConnection *)connection
  32. {
  33. // 该方法触发 证明data已经完整
  34. // 接下来 可以解析数据
  35. NSMutableDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:self.data options:(NSJSONReadingMutableContainers) error:nil];
  36. NSLog(@"%@", dataDic);
  37. NSLog(@"已经完成加载");
  38. }
  39. - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
  40. {
  41. NSLog(@"查看错误信息");
  42. }
  43. #pragma mark -异步请求block方法
  44. // 异步请求block方法
  45. // 建立一个异步请求链接
  46. [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
  47. NSLog(@"%d", [NSThread isMainThread]);
  48. // 异步请求相当于 开启一个子线程去加载数据
  49. // 数据加载完成 调用block 回到主线程
  50. }];

POST异步跟get方法类似 有代理方法和block方法 代理方法和block方法前三步是一样的

  1. //1.创建网址对象
  2. NSURL *url = [NSURL URLWithString:kNewsListURL];
  3. //2. 利用网址对象 创建一个可变请求
  4. NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];
  5. //3.设置请求类型
  6. [request setHTTPMethod:@"POST"];
  7. // 注意 :给这个请求 携带一个请求体
  8. NSData *pramData = [kNewsListParam dataUsingEncoding:NSUTF8StringEncoding];
  9. // 携带到请求体
  10. [request setHTTPBody:pramData];
  11. // 利用这个请求 创建一个链接 并得到返回的数据
  12. NSURLResponse *response = nil;
  13. NSError *error = nil;
  14. NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
  15.  
  16. // 解析数据
  17. NSMutableDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
  18. NSLog(@"%@", dataDic);
  19.  
  20. POST异步跟get方法类似 有代理方法和block方法 代理方法和block方法前三步是一样的
  21. // 创建网址字符创 创建网址对象
  22. NSURL *url = [NSURL URLWithString:kNewsListURL];
  23. // 利用网址对象创建请求
  24. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];
  25. // 设置请求的类型
  26. [request setHTTPMethod:@"POST"];
  27. // 给这个请求 携带请求体
  28. NSData *pramData = [kNewsListParam dataUsingEncoding:NSUTF8StringEncoding];
  29. [request setHTTPBody:pramData];
  30. // 利用block方法完成一步请求
  31. [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
  32.  
  33. // data就是请求完成的数据 解析就可以了
  34. NSMutableDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
  35. NSLog(@"%@", dataDic);
  36.  
  37. 利用请求创建链接 利用代理方法 实现一步请求数据
  38. self.connection = [NSURLConnection connectionWithRequest:request delegate:self];
  39. // 开启链接
  40. [self.connection start];
  41. #pragma mark - 代理方法
  42. - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
  43. {
  44. // 初始化 data
  45. self.data = [NSMutableData data];
  46. NSLog(@"返回服务器信息, 证明链接成功了");
  47. }
  48. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
  49. {
  50. // 拼接data
  51. [self.data appendData:data];
  52. NSLog(@"每次返回一点数据 多次执行");
  53. }
  54. - (void)connectionDidFinishLoading:(NSURLConnection *)connection
  55. {
  56. NSLog(@"%@", self.data);
  57. NSLog(@"完成请求 此时可以进行 数据解析");
  58. }
  59. - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
  60. {
  61. NSLog(@"返回错误信息");
  62. }
  63. #import "PostViewController.h"
  64.  
  65. @interface PostViewController ()<NSURLConnectionDataDelegate, NSURLConnectionDelegate>
  66.  
  67. // 声明一个可变data 进行异步请求
  68. @property (nonatomic, retain) NSMutableData *data;
  69. // 声明成属性 在界面被销毁时 终止请求
  70. @property (nonatomic, retain) NSURLConnection *connection;
  71.  
  72. @end
  73.  
  74. @implementation PostViewController
  75. - (void)dealloc
  76. {
  77. [_connection cancel];
  78. [_connection release];
  79. [_data release];
  80. [super dealloc];
  81. }

网络请求代码有很多重复代码 我们可以自己封装一下.我个人感觉封装有点类似数学中提取公因式,把相同的地方写一个方法,然后给不同的参数

封装网络请求可以想一下什么东西是外边给的,什么事里面封的.写的有点多了,封装就留给朋友吧.

ios编程之网络请求的更多相关文章

  1. iOS美丽约网络请求分析

    网络请求分析html, body {overflow-x: initial !important;}html { font-size: 14px; } body { margin: 0px; padd ...

  2. iOS基础之网络请求相关

    1.AFNetwork二次封装方法一: #import <Foundation/Foundation.h> @interface BeeNetworkManager : NSObject ...

  3. iOS 串行网络请求。。。待研究

    nsurlsession 和 nsurlconnection 能实现吗? 手动实现的关键点在哪里? 我这里说的串行网络请求,指的是第一个网络请求不返回数据,第二个网络请求就不能开始. AFNetwor ...

  4. iOS中的网络请求 和 网络监测

    1.网络监测 //根据主机名判断网络是否连接 Reachability *reach = [Reachability reachabilityWithHostName:@"www.baidu ...

  5. iOS开发之网络请求(基于AFNetworking的再封装)

    最近一直很忙也没有什么时间写博客了.放假了休息一下,就写一篇博客来总结一下最近做项目中出现过的问题吧!!! 首先,在项目中我的起到了什么作用,无非就是把美工(UI设计师)给我们的图显示出来,然后再和服 ...

  6. ios中封装网络请求类

    #import "JSNetWork.h" //asiHttpRequest #import "ASIFormDataRequest.h" //xml 的解析 ...

  7. iOS -读书笔记-网络请求

    知道"3次握手"吗?突然想起这个词 什么是3次握手? TCP三次握手/四次挥手详解 这里是3次握手的详解 3次握手就是为了可靠的传送数据,TCP(什么是TCP呢?TCP就是一种可靠 ...

  8. iOS学习笔记---网络请求

    一.HTTP协议的概念 HTTP协议:Hyper Text Transfer Protocol(超文本传输协议)是用于从万维网服务器传送超文本到本地浏览器的传输协议.HTTP是一个应用层协议,由请求和 ...

  9. Flutter异步编程 http网络请求数据

    import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as ht ...

随机推荐

  1. iOS之05-三大特性之封装

    本次主要学习面向对象的三大特性:封装.继承和多态中的封装 封装 1. 好处 降低耦合率 可重复调用类中的属性 提高安全性,外部不能随便修改变量的值,保证了数据的安全性 2. set方法 1.作用:提供 ...

  2. Start_Learning_Python 03 条件、循环

    if循环 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 条件语句和循环语句可以有 else 子句,它在穷尽列表(以for循环)或条件变为 false ...

  3. Leetcode Partition List

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  4. bug:无法给图片加边框

    一,经历 1.错误代码 _avatarView.layer.cornerRadius = GIFT_AVATAR_WIDTH * 0.5; _avatarView.layer.borderColor ...

  5. Cloudera Manager 5和CDH5离线安装

    CDH (Cloudera’s Distribution, including Apache Hadoop),是Hadoop众多分支中的一种,由Cloudera维护,基于稳定版本的Apache Had ...

  6. C/C++:[2]enum-枚举量声明、定义和使用

    C/C++:[2]enum-枚举量声明.定义和使用 转自:http://jingyan.baidu.com/article/e75aca85526c1b142edac6d9.html 众所周知,C/C ...

  7. 在XP下安装PHP

    最近,有许多朋友问我在WindowsXp下PHP的安装过程,正好最近我在自己的机器上成功的以模块化的方式安装了PHP4.23.既然这么多朋友需要,我就以最常见的IIS和Apache服务器为例,把PHP ...

  8. C# Closure

    JavaScript Closure function f1(){ var n=999; return function(){ alert(n); // 999 return n; } } var a ...

  9. hdu 小希的迷宫

    真是被这道并查集的水题给坑哭了...忘记给uset数组初始化我也是醉了. 题目意思是找到判断是不是连通无环的图,首先想到的就是并查集. 1判断成环的时候,只要判断输入边的两个点.有一个共同的父节点,那 ...

  10. Linux下一些有用的指令

    1.   安装源代码包用到的configure 这用来定位安装位置. 用法: ./configure -prefix=<安装目录>,  前提是文件中有configure执行文件.