ios编程之网络请求

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

GET与POST 区别

1.get请求 请求的网址全部明文显示 安全性不高
 2.get请求 请求的网址 有字符数的限制 大概255个
 3.post请求 请求的网址 不光是有一个请求的网址 还可以携带请求体 这个请求体 是以NSData形式存在 安全性较高
 4.post请求没有字符数的限制

GET同步和GET异步

同步请求是在请求数据的时候不能做其他事情 异步请求在请求数据的时候可以做其他的事.

GET同步请求的步骤

1.创建一个网址对象

1 NSString *oldUrl = kSearchURL;

注意:如果你请求的网址中带有中文 必须进行重新编码

NSString *newUrl = [oldUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

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

 NSURL *url = [NSURL URLWithString:newUrl];

2.发出一个网络请求

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

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

3.设置请求类型

[request setHTTPMethod:@"GET"];

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

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

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

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

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

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

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

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

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

NSURLConnection * connection;

self.connection = [NSURLConnection connectionWithRequest:request delegate:self];

开启异步请求

[self.connection start];

具体代码如下:

@interface GetViewController ()<NSURLConnectionDataDelegate, NSURLConnectionDelegate>
// 声明一个可变的 data 用于拼接完整的方法
@property (nonatomic, retain) NSMutableData *data;
// 声明一个链接属性 用于终止网络请求
@property (nonatomic, retain) NSURLConnection *connection;

@end

@implementation GetViewController
- (void)dealloc
{
    // 如果本页面被销毁 那么要终止网络请求
    [_connection cancel];
    [_data release];
    [_connection release];
    [super dealloc];
}
#pragma mark — NSURLConnectionDataDelegate 4个代理方法
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    // 触发方法 链接成功 初始化 可变data
    self.data = [NSMutableData data];
    NSLog(@"接收到服务器数组, 说明 链接成功");
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // 拼接data
    [self.data appendData:data];
    NSLog(@"接收数据时触发");
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    // 该方法触发 证明data已经完整
    // 接下来 可以解析数据
    NSMutableDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:self.data options:(NSJSONReadingMutableContainers) error:nil];
    NSLog(@"%@", dataDic);
    NSLog(@"已经完成加载");
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"查看错误信息");
}
#pragma mark -异步请求block方法
    // 异步请求block方法
    // 建立一个异步请求链接
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
  NSLog(@"%d", [NSThread isMainThread]);
// 异步请求相当于 开启一个子线程去加载数据
// 数据加载完成 调用block 回到主线程
 }];

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

//1.创建网址对象
 NSURL *url = [NSURL URLWithString:kNewsListURL];
 //2. 利用网址对象 创建一个可变请求
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];
 //3.设置请求类型
    [request setHTTPMethod:@"POST"];
    // 注意 :给这个请求 携带一个请求体
    NSData *pramData = [kNewsListParam dataUsingEncoding:NSUTF8StringEncoding];
    // 携带到请求体
    [request setHTTPBody:pramData];
    // 利用这个请求 创建一个链接 并得到返回的数据
    NSURLResponse *response = nil;
    NSError *error = nil;
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    // 解析数据
    NSMutableDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
    NSLog(@"%@", dataDic);

POST异步跟get方法类似 有代理方法和block方法 代理方法和block方法前三步是一样的
// 创建网址字符创 创建网址对象
    NSURL *url = [NSURL URLWithString:kNewsListURL];
    // 利用网址对象创建请求
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];
    // 设置请求的类型
    [request setHTTPMethod:@"POST"];
    // 给这个请求 携带请求体
    NSData *pramData = [kNewsListParam dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:pramData];
// 利用block方法完成一步请求
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

        // data就是请求完成的数据 解析就可以了
        NSMutableDictionary *dataDic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
        NSLog(@"%@", dataDic);

 利用请求创建链接 利用代理方法 实现一步请求数据
    self.connection = [NSURLConnection connectionWithRequest:request delegate:self];
    // 开启链接
    [self.connection start];
#pragma mark - 代理方法
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    // 初始化 data
    self.data = [NSMutableData data];
    NSLog(@"返回服务器信息, 证明链接成功了");
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // 拼接data
    [self.data appendData:data];
    NSLog(@"每次返回一点数据 多次执行");
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"%@", self.data);
    NSLog(@"完成请求 此时可以进行 数据解析");
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"返回错误信息");
}
#import "PostViewController.h"

@interface PostViewController ()<NSURLConnectionDataDelegate, NSURLConnectionDelegate>

// 声明一个可变data 进行异步请求
@property (nonatomic, retain) NSMutableData *data;
// 声明成属性 在界面被销毁时 终止请求
@property (nonatomic, retain) NSURLConnection *connection;

@end

@implementation PostViewController
- (void)dealloc
{
    [_connection cancel];
    [_connection release];
    [_data release];
    [super dealloc];
}

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

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

时间: 2024-10-25 05:42:39

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

ios中封装网络请求类

ios中封装网络请求类 #import "JSNetWork.h" //asiHttpRequest #import "ASIFormDataRequest.h" //xml 的解析 #import "UseXmlParser.h" //判断是否联网 #import "Reachability.h" //sbJson,判断json的解析 #import "JSON.h" @implementation JS

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

一.HTTP协议的概念 HTTP协议:Hyper Text Transfer Protocol(超文本传输协议)是用于从万维网服务器传送超文本到本地浏览器的传输协议.HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型(c/s) HTTP协议的特点 支持客户/服务器模式(c/s模式) 简单快速 灵活,HTTP允许任意类型的对象进行传输,正在传输的对象类型由Content-type加以标记 iOS学习笔记---网络请求

iOS开发之网络请求(一)ASIHTTPRequest

全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大 基于底层的CFNetwork框架,运行效率很高 可惜作者早已停止更新,有一些潜在的BUG无人去解决 很多公司的旧项目里面都残留着它的身影,以前的很多iOS项目都是ASI + SBJson 会不会用ASI,可以算是检验是否为老牌iOS程序员的标准之一 ASI的github地址 https://github.com/pokeb/asi-http-request ASI的使用参考 http://www.cnblogs.com/d

iOS开发 - AFNetworking网络请求

AFNetworking 什么是AFN 全称是AFNetworking,是对NSURLConnection.NSURLSession的一层封装 虽然运行效率没有ASI高,但是使用比ASI简单 在iOS开发中,使用比较广泛 AFN的github地址 https://github.com/AFNetworking/AFNetworking AFHTTPRequestOperationManager 是AFN中最重要的对象之一 封装了HTTP请求的常见处理 GET\POST请求 解析服务器的响应数据

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

最近一直很忙也没有什么时间写博客了.放假了休息一下,就写一篇博客来总结一下最近做项目中出现过的问题吧!!! 首先,在项目中我的起到了什么作用,无非就是把美工(UI设计师)给我们的图显示出来,然后再和服务器进行交互. 那个我们和服务器怎么交互呢?最简单的方式就是说话呗,但是我们要跟服务器说话必须通过我们彼此能听的懂的话来交流,也就需要制定很多的协议了(http,tcp,udp等,这个有兴趣的朋友可以了解一下网络协议的东西).但是我平常最常使用的还是http协议. http://www.cnblog

IOS中的网络请求

使用NSURLConnection的网络请求,最好定义一个类方法,在主线程中直接调用类方法获取请求到的网络数据 //构建类方法--请求网络 + (void)requestData:(NSString *)urlStr httpMethod:(NSString *)method params:(NSMutableDictionary *)params comletionHandle:(void (^)(id result))block { //1.构建URL urlStr = [BASE_URL

ios之NSURLConnection网络请求数据/GET与POST方法

目前可能只是单纯的贴上了一些demo的代码,但是这些代码都是请求数据应该是最基础的使用方法吧,在项目的实际开发中可能用到系统的会非常少,一般都是采用别人非常成熟的第三方开源库来实现数据请求,目前常用的第三方网络请求主要是以下几个:<h3 style="margin: 18px 0px; padding: 0px 0px 5px; border: 0px; outline: 0px; font-size: 22px; vertical-align: baseline; color: rgb(

iOS基础之网络请求相关

1.AFNetwork二次封装方法一: #import <Foundation/Foundation.h> @interface BeeNetworkManager : NSObject /** * POST网络请求 * 每个请求都添加公共参数 */ + (void)POSTWithUrlString:(NSString *)urlString parameters:(NSMutableDictionary *)parameters success:(void (^)(id responseO

iOS -读书笔记-网络请求

知道"3次握手"吗?突然想起这个词 什么是3次握手? TCP三次握手/四次挥手详解 这里是3次握手的详细解释 3次握手就是为了可靠的传送数据,TCP(什么是TCP呢?TCP就是一种可靠传输的协议)在发送数据之前,两台主机之间进行3次握手.3次握手完成后才发送数据. 预备知识: 位码即tcp标志位,有6种标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(ur