IOS开发系列之阿堂教程:玩转IPhone客户端和Web服务端交互(客户端)实践
说到ios的应用开发,我们不能不提到web server服务端,如果没有服务端的支持,ios应用开发就没有多大意义了,因为从事过手机开发的朋友都知道(Android也一样),大量复杂业务的处理和数据库的处理,其实大部分都是在服务端来完成的,因为iphone客户端的资源是非常有限的,象内存,多线程处理等。我们更多的是把Iphone/ipad等作为一个终端和载体,虽然Iphone客户端也会有自己的数据库,象SQLITE3等,但是也只是非常少量的客户端的数据库存储操作而也。所以我们与其说iphone应用的强大,不与说是iphone坚强后盾服务端功能的强大。但是,要想让服务端来处理客户端的一些业务请求,这里首先需要解决客户端和服务端之间交互的问题。下面,阿堂就重点讲解开源库 ASIHTTPREQUEST 的用法了,这是目前IOS 开发中比较主流的一种通讯方式(实现iphone客户端和web server的通讯),实际就是对IOS自带的通讯交互方式作了一些更好的封装。
当我们点登录时,就会由IPHONE 发通讯请求到web server端,WEB SERVER 端收到请求后,会对请求进行分析处理后,封装相应的业务数据反馈给IPHONE 客户端,客户端得到反馈的信息后,若正常就会跳到如下正常的业务界面,进行后续的操作了;若不正常,则会弹出相应的信息窗口显示显示给当前操作者。(不正常的弹出信息窗口,我这里不截图说明了)
iphone客户端和服务端交互一般来说,有三种方式可以实现。
一. 方式1. 是ios自带的api中的通讯方式
NSMutableURLRequest* urlRequest = [[NSMutableURLRequestalloc]initWithURL:url
cachePolicy:NSURLRequestReloadIgnoringCacheData
timeoutInterval:NETWORK_TIMEOUT];
url参数就是一个http地址
NSMutableURLRequest有诸如setHTTPMethod、setValue、setHTTPBody之类的方法
发送一个请求:
NSURLConnection* connection = [[NSURLConnection alloc]initWithRequest:urlRequest
delegate:self];
[connection start];
connection的delegate负责服务器端返回数据的接收,这个delegate(NSURLConnectionDataDelegate)实现如下一些方法:
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData*)data;
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError*)error;
(以上方法的使用,比较简单,阿堂就不再特别说明了,看看下面的ASIHTTPREQUEST 的实现方式就很好理解了,也可以从XCODE 的帮助文档中去查看)
二. 方式2 和方式3(采用 ASIHTTPREQUEST 的方式)
要想使用 asihttprequest的开源库,前提是要导入如下的开源库文件和对应的 lib文件,如下
图,其中红线标明的是必须要导入的lib,否则使用asihttprequest时会报错的
方式2:采用 get方式
/* Get 提交方式
NSString *urlString = [NSString stringWithFormat:@"http://www.isn.com/zzgame/ProcesLogin?param=%@&userName=%@&passWord=%@",@"login",userName,passWord];
// 向应用服务器发出请求验正 用户名,密码,是否正确
NSURL *url = [NSURL URLWithString:urlString];
m_Request = [ASIHTTPRequest requestWithURL:url];
// 设置请求超时时,设置重试的次数
[m_Request setTimeOutSeconds:60];
[m_Request setNumberOfTimesToRetryOnTimeout:3];
[m_Request addRequestHeader:@"User-Agent" value:@"[AH:6753048720{-}0{-}1{-}1{-}iphone3G{-}iphone{-}320x480]"];
[m_Request setDelegate:self];
[m_Request startAsynchronous]; //异步方式
方式3:采用post方式(这是阿堂推荐的一种最好方式)
以下重要信息,根据实际情况,要进行加密后处理,为了不增加说明的复杂性,阿堂下面就没有相应处理了,这不是今天讨论的重点,请网友在使用时自行处理了。(可采用base64等方式去加密和解密)
NSURL *url = [NSURL URLWithString:@"http://www.isn.com/zzgame/ProcesLogin"];
m_Request = [[ASIFormDataRequest alloc] initWithURL:url];
NSMutableDictionary *postData = [[NSMutableDictionary alloc] initWithCapacity:2];
NSMutableDictionary *data = [[NSMutableDictionary alloc] initWithCapacity:5];
[data setObject:@"login" forKey:@"param"];
[data setObject:userName1 forKey:@"userName"];
[data setObject:passWord1 forKey:@"passWord"];
[postData setValue:data forKey:@"data"];
NSString *jsonString = [postData JSONRepresentation];
[m_Request setDelegate:self];
[m_Request setPostValue:jsonString forKey:@"p_data"];
[m_Request setTimeOutSeconds:120];
[m_Request startAsynchronous]; //异步执行
ASIFormDataRequest *m_Request;
<ASIHTTPRequestDelegate>
self.recData.length = 0;
}
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF8);
NSString *aString = [[NSString alloc]initWithData:self.recData encoding:enc];
if ([aString isEqualToString:@"YES"]) {
//这里写上自己实际的代码
}else{
}
}
NSError *error =[request error];
NSDictionary * userInfoDirectionary = error.userInfo;
NSString *content = [userInfoDirectionary objectForKey:@"NSLocalizedDescription"];
if ([content isEqualToString:@"The request timed out"]) {
//写上自己的实际代码
}else if([content isEqualToString:@"Unable to create request (bad url?)"]){
//写上自己的实际代码
}
else{
//写上自己的实际代码
}
}
[self.recData appendData:data];
}
String userName ="";
String passWord ="";
PrintWriter out = response.getWriter();
String p_data = request.getParameter("p_data");
//服务端获得iphone端传来的最终json数据 {"data":{"userName":"test","passWord":"123456","param":"login"}}
JSONObject firstJSON = JSONObject.fromObject(p_data);
JSONObject secondJSON= JSONObject.fromObject(firstJSON.get("data"));
Iterator iter = secondJSON.keySet().iterator();
while(iter.hasNext()) {
String key = iter.next().toString();
if(key.equals("userName")){
userName = secondJSON.getString("userName");
}else if(key.equals("passWord")){
passWord = secondJSON.getString("passWord");
}else if(key.equals("param")){
param = secondJSON.getString("param");
}else{
}
}
//获取web容器
ServletContext servletContext = this.getServletContext();
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
//获取springIOC容器中的业务组件
iphoneAndIPadService = (IPhoneAndIPadService) ctx.getBean("iphoneAndIPadService");
String result = iphoneAndIPadService.judgeLoginIsVlidateOrNot(param , userName, passWord);
if(result.equals("YES")){
out.print("YES");
}else{
out.print("NO");
}
out.flush();
-------------------------------------------------------------------------
补充说明
以上红色部分,请网友根据自己web server服务端的实际情况,将网络时空(阿堂)上面的代码换成相应的替代代码。
IOS开发系列之阿堂教程:玩转IPhone客户端和Web服务端交互(客户端)实践的更多相关文章
- cas sso单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析
转:http://blog.csdn.net/ae6623/article/details/8848107 1)PPT流程图:ppt下载:http://pan.baidu.com/s/1o7KIlom ...
- SSO单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析
落雨 cas 单点登录 一.用户第一次访问web1应用. ps:上图少画了一条线,那一条线,应该再返回来一条,然后再到server端,画少了一步...谢谢提醒.而且,重定向肯定是从浏览器过去的.我写的 ...
- [Swoole系列入门教程 2] 入门级的Swoole的demo.服务端与客户端
- ASIHTTPRequest框架使用总结系列之阿堂教程1(安装配置篇
在前年,阿堂在<IOS开发系列之阿堂教程:玩转IPhone客户端和Web服务端交互(客户端)实践>一文中,对于ASIHTTPRequest框架有过一些介简单绍,具体链接地址见http:// ...
- iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
- iOS开发系列--数据存取
概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...
- 【转】iOS开发系列--数据存取
原文: http://www.cnblogs.com/kenshincui/p/4077833.html#SQLite 概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储 ...
- iOS开发系列文章(持续更新……)
iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...
- iOS开发系列--App扩展开发
概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...
随机推荐
- 6-3 二叉树的重建 uva536
已知先序和中序 求后序 可以有两种方式输出 一种是建好树按照树输出 一种是不建树 在遍历的过程中存入vector 再倒叙输出 #include<bits/stdc++.h> usin ...
- 【Java】 剑指offer(35) 复杂链表的复制
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请实现函数ComplexListNode* Clone(Compl ...
- Python 导入requests报错No module named requests
刚开始是在Pycharm里面,发现就是不对,导入老提示No module named requests这个错误.后面发现是指向的python.exe路径不对,到setting里面设置换一下路径就好.
- Linux学习之文件系统常用命令(七)
Linux文件系统常用命令 目录 df命令 du命令 fsck命令 dump2fs命令 df命令 df命令 统计文件系统的占有情况,分区用了多少空间,还剩多少空间 df [选项] [挂载点] 选项: ...
- C#读取大数据量Excel
var worksheet = workbook.Worksheets["工作表1"]; var maxN = worksheet.Range["A1"].En ...
- Angularjs 根据数据结构创建动态菜单无限嵌套循环--指令版
目标:根据数据生成动态菜单,希望可以根据判断是否有子集无限循环下去. 菜单希望的样子是这样的: 菜单数据是这样的: $scope.expanders = [{ title: 'title1', lin ...
- APIO2018 铜滚记
「一旦闭上双眼,就昏昏欲睡」「仿佛与这个世界的联系,被瞬间切断」「可是,负罪感与背德感又会在黑暗中将我吞噬」「即使这样,却也无法与身体的疲惫抗衡」 「如果,这些东西也无法让意识的存在稳定下来的话」「那 ...
- 【WIN32编程】利用汇编写cs1.6辅助
这篇文章本来在2018.5.1号就写完发圈子去了,这两天跟朋友在网吧打单击才想起来,就顺便把内容发上去把 作者:admin-神风 用CE找到功能的地址 CS1.6下载地址:https://pan.ba ...
- Java并发程序设计(十)设计模式与并发之Future模式
设计模式与并发之Future模式 核心思想:异步调用. /** * @author: Tang Jiujia * @version: 2017/9/18 0018 15:22 */ public in ...
- [洛谷3375]【模板】KMP字符串匹配
思路: KMP模板. #include<cstdio> #include<cstring> ],s2[]; int main() { scanf("%s%s" ...