iOS 开发指南 第15章 访问Web Service之REST Web Service

*****

在电脑术语中,统一资源标识符(Uniform Resource Identifier,或URI)是一个用于标识某一互联网资源名称的字符串。 该种标识允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作。URI由包括确定语法和相关协议的方案所定义。

Web上可用的每种资源 -HTML文档、图像、视频片段、程序等 - 由一个通用资源标识符(Uniform Resource Identifier, 简称"URI")进行定位。

*****

1 REST Web Service 是一个使用HTTP并遵循REST原则的Web Service,使用URI来资源定位。Web Service支持的请求方式包括POST GET等。

Web Service应用层采用的是HTTP和HTTPS等传输协议。

GET方法是向指定的资源发出请求,发送的信息“显示”地跟在URL后面,GET方法应该只用于读取数据,它是不安全的。

POST方法是向指定资源提交数据,请求服务器进行处理,数据被包含在请求体中,是安全的。

GET POST方法与同步请求与异步请求无关。

2 同步GET请求方法

iOS SDK 为HTTP请求提供了同步和异步请求两种API,而且还可以使用GET和POST等请求方法。

创建URL(3步走)-创建request-发送请求接受数据-解析数据

/*
 * 开始请求Web Service
 */
-(void)startRequest
{
    指定请求的URL ?后面是请求参数,一般是开发者提供
    NSString *strURL = [[NSString alloc] initWithFormat:@"http://www.51work6.com/service/mynotes/WebService.php?email=%@&type=%@&action=%@",@"<你的51work6.com用户邮箱>",@"JSON",@"query"];    将字符串编码为URL字符串 因为URL中不能有特殊字符
    strURL = [strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL *url = [NSURL URLWithString:strURL];
    创建请求
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
    同步请求发送并接受数据 异步的方法,发送同步的请求
    NSData *data  = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    NSLog(@"请求完成...");    解析数据
    NSDictionary *resDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
    [self reloadView:resDict];

}

//重新加载表视图
-(void)reloadView:(NSDictionary*)res
{
    NSNumber *resultCode = [res objectForKey:@"ResultCode"];
    if ([resultCode integerValue] >=0)说明在服务器端操作成功
    {
        self.objects = [res objectForKey:@"Record"];
        [self.tableView reloadData];
    } else { 意味着ResultCode=-1;
        NSString *errorStr = [resultCode errorMessage];NSNumber分类定义的方法,用于区分错误
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"错误信息"
                                                            message:errorStr
                                                           delegate:nil
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles: nil];
        [alertView show];
    }

3 异步GET请求方法

NSURLConnection NSURLConnectiongDelegate 在请求的不同阶段会调用不同方法

方法:connection:didReceiveData:请求成功并建立连接

connection:didFailWithError:加载数据出现异常

connectionDidFinishLoading:成功完成数据加载

创建链接发送请求调用代理方法-接受数据-解析数据

/*
 * 开始请求Web Service
 */
-(void)startRequest
{

    NSString *strURL = [[NSString alloc] initWithFormat:@"http://www.51work6.com/service/mynotes/WebService.php?email=%@&type=%@&action=%@",@"<你的51work6.com用户邮箱>",@"JSON",@"query"];
    strURL = [strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSURL *url = [NSURL URLWithString:strURL];

    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
    创建链接发送请求
    NSURLConnection *connection = [[NSURLConnection alloc]
                                   initWithRequest:request
                                   delegate:self];
    if (connection) {
        self.datas = [NSMutableData new];准备接收数据
    }
}

#pragma mark- NSURLConnection 回调方法
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [self.datas appendData:data];
}

-(void) connection:(NSURLConnection *)connection didFailWithError: (NSError *)error {

    NSLog(@"%@",[error localizedDescription]);
}

- (void) connectionDidFinishLoading: (NSURLConnection*) connection {
    NSLog(@"请求完成...");
    NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:self.datas options:NSJSONReadingAllowFragments error:nil];
    [self reloadView:dict];
}

4 POST请求方法(异步)

关键是用NSMutableURLRequest类代替NSURLRequest

创建服务器URL-创建请求体-将请求体编码为请求参数-创建可变请求对象NSMutableURLRequest-创建链接调用代理方法

/*
 * 开始请求Web Service
 */
-(void)startRequest
{

    NSString *strURL = @"http://www.51work6.com/service/mynotes/WebService.php";
    strURL = [strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL *url = [NSURL URLWithString:strURL];
    请求体
    NSString *post = [NSString stringWithFormat:@"email=%@&type=%@&action=%@", @"<你的51work6.com用户邮箱>",@"JSON",@"query"];    请求参数
    NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding];
    创建请求设置内容
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:postData];

    NSURLConnection *connection = [[NSURLConnection alloc]
                                   initWithRequest:request
                                   delegate:self];
    if (connection) {
        self.datas = [NSMutableData new];
    }
}

#pragma mark- NSURLConnection 回调方法
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [self.datas appendData:data];
}

-(void) connection:(NSURLConnection *)connection didFailWithError: (NSError *)error {

    NSLog(@"%@",[error localizedDescription]);
}

- (void) connectionDidFinishLoading: (NSURLConnection*) connection {
    NSLog(@"请求完成...");
    NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:self.datas options:NSJSONReadingAllowFragments error:nil];
    [self reloadView:dict];
}

5 调用REST Web Service的插入 修改 删除方法

1)插入

使用POST请求传入数据再使用回调方法获取已经改好的数据

 * 开始请求Web Service
 */
-(void)startRequest
{
    //准备参数
    NSDate *date = [NSDate new];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd"];    当前的系统日期
    NSString *dateStr = [dateFormatter stringFromDate:date];
    //设置参数
    NSString *post = [NSString stringWithFormat:@"email=%@&type=%@&action=%@&date=%@&content=%@",
                      @"<你的51work6.com用户邮箱>",@"JSON",@"add",dateStr,self.txtView.text];

    NSString *strURL = @"http://www.51work6.com/service/mynotes/WebService.php";
    strURL = [strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSURL *url = [NSURL URLWithString:strURL];

    NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:postData];

    NSURLConnection *connection = [[NSURLConnection alloc]
                                   initWithRequest:request delegate:self];

    if (connection) {
        _datas = [NSMutableData new];
    }
}

#pragma mark- NSURLConnection 回调方法
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [self.datas appendData:data];
}

-(void) connection:(NSURLConnection *)connection didFailWithError: (NSError *)error {

    NSLog(@"%@",[error localizedDescription]);
}

- (void) connectionDidFinishLoading: (NSURLConnection*) connection {
    NSLog(@"请求完成...");
    NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:self.datas options:NSJSONReadingAllowFragments error:nil];

    NSString *message = @"操作成功。";

    NSNumber *resultCodeObj = [dict objectForKey:@"ResultCode"];

    if ([resultCodeObj integerValue] < 0) {
        message = [resultCodeObj errorMessage];
    }

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示信息"
                                                        message:message
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles: nil];
    [alertView show];

}

2)删除

删除与查询是在同一个视图控制器中,需要做一些判断。

将请求Web Service的startRequest方法放到这里,可以保证每次改视图出现时都会请求服务器返回数据-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:YES];
     action = QUERY;自定义枚举
    [self startRequest];
}

删除方法是在表视图数据源方法实现的:

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        //删除数据
        action = REMOVE;
        deleteRowId = indexPath.row;       开始在数据库中删除疏浚
        [self startRequest];
    } else if (editingStyle == UITableViewCellEditingStyleInsert) {

    }
}

startRequest方法中需要判断请求动作标示

/*
 * 开始请求Web Service
 */
-(void)startRequest {

    NSString *strURL = @"http://www.51work6.com/service/mynotes/WebService.php";
    strURL = [strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    NSURL *url = [NSURL URLWithString:strURL];

    NSString *post;
    if (action == QUERY) {//查询处理
        post = [NSString stringWithFormat:@"email=%@&type=%@&action=%@", @"<你的51work6.com用户邮箱>",@"JSON",@"query"];
    } else if (action == REMOVE) {//删除处理

        NSMutableDictionary*  dict = self.objects[deleteRowId];
        post = [NSString stringWithFormat:@"email=%@&type=%@&action=%@&id=%@",
                @"<你的51work6.com用户邮箱>",@"JSON",@"remove",[dict objectForKey:@"ID"]];
    }

    NSData *postData  = [post dataUsingEncoding:NSUTF8StringEncoding];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:postData];

    NSURLConnection *connection = [[NSURLConnection alloc]
                                   initWithRequest:request delegate:self];

    if (connection) {
        self.datas = [NSMutableData new];
    }
}

connectionDidFinishLoading:也要判断标示

- (void) connectionDidFinishLoading: (NSURLConnection*) connection {
    NSLog(@"请求完成...");

//    NSString* str = [[NSString alloc] initWithData:self.datas  encoding:NSUTF8StringEncoding];
//    NSLog(str);

    NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:self.datas options:NSJSONReadingAllowFragments error:nil];

    if (action == QUERY) {//查询处理
        [self reloadView:dict];
    } else if (action == REMOVE) {//删除处理

        NSString *message = @"操作成功。";
        NSNumber *resultCodeObj = [dict objectForKey:@"ResultCode"];

        if ([resultCodeObj integerValue] < 0) {
            message = [resultCodeObj errorMessage];
        }

        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"提示信息"
                                                            message:message
                                                           delegate:nil
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles: nil];
        [alertView show];

        //重新查询
        action = QUERY;
        [self startRequest];
    }

}
时间: 2024-10-25 03:55:52

iOS 开发指南 第15章 访问Web Service之REST Web Service的相关文章

iOS 开发指南 第15章 访问Web Service之使用轻量级网络请求架构MKNetworkKIt

除苹果提供的NSURLConnection和NSURLRequest外第三方的网络框架 1 安装和配置MKNetworkKit框架 下载并打开MKNetworkKit目录添加MKNetworkKit文件夹到新工程中-添加支持的类库或框架 CFNetwork.framework SystemConfiguration.framework Security.framework-添加预编译头文件 #ifndef MyNotes/MyNotes-Prefix.pch #define MyNotes/My

iOS 开发指南 第15章 访问Web Service之数据交换格式

“自描述的”结构化文档 1 XML文档结构 声明:定义了XML文件的版本和使用的字符集 <> 根元素:开始标签  结束标签 子元素:开始标签 结束标签 属性:  定义在开始标签中 属性名 属性值(放置在双引号或单引号之间) 一个元素不能有多个名字相同的属性. 命名空间:为XML文档提供名字唯一的元素和属性 ************ XML 命名空间提供避免元素命名冲突的方法. XML Namespace (xmlns) 属性 XML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法:

iOS 开发指南 第15章 访问Web Service之反馈网络信息改善用户体验

1 使用下拉刷新控件改善用户体验 表视图UIRefreshControl类型的refreshControl属性,不需要考虑控件布局问题 初始化: 设置attributedTitle属性 添加事件处理机制 - (void)viewDidLoad { [super viewDidLoad]; //查询请求数据 action = QUERY; [self startRequest]; //初始化UIRefreshControl UIRefreshControl *rc = [[UIRefreshCon

iOS开发指南 第8章 iOS常用设计模式 学习

设计模式是在特定场景下对特定问题的解决方案 1 单例模式 作用:解决“应用中只有一个实例”的问题,这个实例的作用是全局的,比如说是可以实现一些共享资源 方法的访问和状态的保持 实现原理:一般会封装一个静态属性,并提供静态实例的创建方法. *********** James Rumbaugh对类的定义是:类是具有相似结构.行为和关系的一组对象的描述符.类是面向对象系统中最重要的构造块.类图显示了一组类.接口.协作以及他们之间的关系. 建立类图的步骤: (1)研究分析问题领域确定系统需求. (2)确

IOS开发指南第四章 IOS8多分辨率屏幕适配 学习

1 获取IOS设备屏幕信息 CGSize iOSDeviceScreenSize = [UIScreen mainScreen].bounds.size; NSString *s = [NSString stringWithFormat:@"%.0f x %.0f", iOSDeviceScreenSize.width, iOSDeviceScreenSize.height]; 获取设备信息判断是否是ipone-判断横屏还是竖屏-判断设备型号 属性userInterfaceIdiom是

iOS 开发指南 第12章 应用程序设置

1 概述 设置中的项目在应用中是不经常变化的,它决定了应用的基本特征和行为. 配置是在应用内部开辟出来的功能块,是应用的一部分,项目是经常变化的. 2 应用程序设置包 Settings Bundle是一个包文件,其中含有设置界面中所需的项目的描述 用到的照片 文字的本地化 子设置项目的描述等内容.通过finder打开. Root.plist文件描述根设置界面中设置的项目信息. en.lproj文件夹和Root.strings文件是和本地化有关,用于设置界面信息的本地化. 创建:iOS-Resou

iOS 开发指南 第11章 数据持久化之属性列表 学习

1 概述 沙箱目录:一种安全策略,原理是只能允许自己的应用访问目录,而不许其他应用访问. 子目录:Documents 用于储存非常大的文件或需要非常频繁更新的数据 NSArray *documentDirectory=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES): documentDirectory是只有一个元素的数组,还需要取出路径 NSString *myDocPath=[docum

iOS 开发指南 第16章 定位服务与地图应用之使用苹果地图

1 显示地图 MKMapView MKMapViewDelegate 准备:加载MapKit.framework 设置地图样式 代理-实现代理方法 - (void)viewDidLoad { [super viewDidLoad]; 设置样式,枚举类型MKMapType self.mapView.mapType = MKMapTypeStandard; // self.mapView.mapType = MKMapTypeSatellite; 将当前视图控制器赋值给地图视图的delegate属性

IOS 开发指南 第三章学习

1 uiwindow 的rootwiew决定了应用程序的类型 2 反映视图关系的3个属性 superview:有且仅有一个(除了uiwindow) subviews:子视图的集合 window:获得当前视图的uiwindow对象 3 按钮至少有两种:uibutton uibarbuttonitem 4 selector是一个指针变量,意思是将方法指定给控件去做 sender是事件源,指要使用这个方法的控件对象 5 使控件的事件与动作关联在一起 1)addTarget:action:forCont