IOS開發系列之阿堂教程:玩轉IPhone客戶端和Web服務端交互(客戶端)實踐


到ios的應用開發,我們不能不提到web server服務端,如果沒有服務端的支持,ios應用開發就沒有多大意義了,因為從事過手機開發的朋友都知道(Android也一樣),大量復雜業務的處理和數據庫的處理,其實大部分都是在服務端來完成的,因為iphone客戶端的資源是非常有限的,象內存,多線程處理等。我們更多的是把Iphone/ipad等作為一個終端和載體,雖然Iphone客戶端也會有自己的數據庫,象SQLITE3等,但是也只是非常少量的客戶端的數據庫存儲操作而也。所以我們與其說iphone應用的強大,不與說是iphone堅強后盾服務端功能的強大。但是,要想讓服務端來處理客戶端的一些業務請求,這里首先需要解決客戶端和服務端之間交互的問題。下面,阿堂就重點講解開源庫 ASIHTTPREQUEST 的用法了,這是目前IOS 開發中比較主流的一種通訊方式(實現iphone客戶端和web server的通訊),實際就是對IOS自帶的通訊交互方式作了一些更好的封裝。

下面,網絡時空(阿堂)就以下圖示中的demo來說明整個流程

 

IOS開發系列之阿堂教程:玩轉IPhone客戶端和Web服務端交互(客戶端)實踐

 

IOS開發系列之阿堂教程:玩轉IPhone客戶端和Web服務端交互(客戶端)實踐



當我們點登錄時,就會由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文件,如下

 

IOS開發系列之阿堂教程:玩轉IPhone客戶端和Web服務端交互(客戶端)實踐

 

圖,其中紅線標明的是必須要導入的lib,否則使用asihttprequest時會報錯的

 

 

IOS開發系列之阿堂教程:玩轉IPhone客戶端和Web服務端交互(客戶端)實踐

 

方式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等方式去加密和解密)

 

// Post提交方式
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]; //異步執行
交互時步驟如下
1.請先定義如下兩個變量
NSMutableData *recData;
ASIFormDataRequest *m_Request;
2.實現如下協議
@interface LoginViewController : UIViewController
< ASIHTTPRequestDelegate>
3.實現如下四個代理方法
- (void)requestStarted:(ASIHTTPRequest *)request{
self.recData.length = 0;
}
- (void)requestFinished:(ASIHTTPRequest *)request{
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF8);
NSString *aString = [[NSString alloc]initWithData:self.recData encoding:enc];
if ([aString isEqualToString:@"YES"]) {
//這里寫上自己實際的代碼
}else{
//彈出錯誤信息的彈出窗口
}
}
- (void)requestFailed:(ASIHTTPRequest *)request{
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{
//寫上自己的實際代碼
}
}
- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data{
[self.recData appendData:data];
}
 
文中,阿堂給出Iphone客戶端的詳細講解,想必網友們應該對Iphone如何與web server服務端交互有了全面的了解。下面阿堂就准備開始繼續揭開web server服務端的神秘面紗了,相信網友看完這篇文章后,應該對iphone客戶端與服務端交互就會有一個比較全面的,完整的了解了,如果稍加改裝的話,就可以馬上應用到ios的開發項目中去了,這樣阿堂就會覺得很欣慰了,因為幫助了別人,也就快樂了自己!
實際上,上篇文章中的調用方式后,我們會在服務端收到的數據是 {"data":{"userName":"test","passWord":"123456","param":"login"}}也就是說通過 String p_data = request.getParameter("p_data"); 方式后,最終得到的p_data 的值為 {"data":{"userName":"test","passWord":"123456","param":"login"}},哈哈,知道是這樣的內容后,阿堂在下面作了一些處理后,就完成了正常的web server 服務端的正常交互了!
-------------------------------------------------------------------------
String param = "";
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服務端的實際情況,將網絡時空(阿堂)上面的代碼換成相應的替代代碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM