Web Service使用的主要協(xié)議是HTTP協(xié)議,即 超文本傳輸協(xié)議 。

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供新邱網(wǎng)站建設(shè)、新邱做網(wǎng)站、新邱網(wǎng)站設(shè)計(jì)、新邱網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、新邱企業(yè)網(wǎng)站模板建站服務(wù),10多年新邱做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
HTTP/1.1協(xié)議共定義了8種請(qǐng)求方法(OPTIONS、HEAD、GET、POST、PUT、DELETE、TRACE、CONNECT)作為Web服務(wù)器。
GET方法 ,是向指定的資源發(fā)送請(qǐng)求,請(qǐng)求的參數(shù)“顯式”地在URL的后面。有點(diǎn)像明信片,把內(nèi)容“顯式”寫在外面,因此安全性比較差。一般使用于讀取數(shù)據(jù)、例如從服務(wù)器讀取靜態(tài)圖片、或查詢數(shù)據(jù)等。
POST方法 ,是向指定資源提交數(shù)據(jù),請(qǐng)求服務(wù)器進(jìn)行處理,數(shù)據(jù)包含在 請(qǐng)求體 中。參數(shù)和地址分開,放在body里面。有點(diǎn)像把信內(nèi)容放在信封中,接觸的人看不到,安全性比較高。一般用于例如提交表單、上傳文件等(請(qǐng)求的的動(dòng)態(tài)資源,與查詢類似,每個(gè)方法調(diào)用都要傳遞很多參數(shù),因此需要使用NSMutableURLRequest創(chuàng)建請(qǐng)求。 )
iOS SDK中為HTTP請(qǐng)求提供了同步和異步請(qǐng)求這兩種不同的API,
同步請(qǐng)求,可以從因特網(wǎng)請(qǐng)求數(shù)據(jù),一旦發(fā)送同步請(qǐng)求,程序?qū)⑼V褂脩艚换ィ敝练?wù)器返回?cái)?shù)據(jù)完成,才可以進(jìn)行下一步操作,意味著線程阻塞;
異步請(qǐng)求,不會(huì)阻塞主線程,而會(huì)建立一個(gè)新的線程來操作,用戶發(fā)出異步請(qǐng)求后,依然可以對(duì)UI進(jìn)行操作,程序可以繼續(xù)運(yùn)行;
它們的主要區(qū)別在于連接方式的不同。
下面通過請(qǐng)求一個(gè)登陸接口介紹有關(guān)于網(wǎng)絡(luò)請(qǐng)求中的不同情況。
【本次開發(fā)環(huán)境: Xcode:7.2 ? ??iOS Simulator:iphone6 ? By:啊左】
一、GET方法
1.同步get方法:
//1.創(chuàng)建一個(gè)web路徑?
NSString*webPath=[NSString?stringWithFormat:@";pass=%@btn=login",yourname,yourpass]; ? ? ?
webPath=[webPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];?//url不允許為中文等特殊字符,需要進(jìn)行字符串的轉(zhuǎn)碼為URL字符串,例如空格轉(zhuǎn)換后為“%20”;? ? ?
NSURL *url=[NSURL URLWithString:webPath];? ? ??
//2.根據(jù)WEB路徑創(chuàng)建一個(gè)請(qǐng)求? ? ?
NSURLRequest? *request=[NSURLRequest requestWithURL:url];? ? ? ? ?
NSURLResponse *respone;//獲取連接的響應(yīng)信息,可以為nil? ? ?
NSError *error;? ? ? ? //獲取連接的錯(cuò)誤時(shí)的信息,可以為nil? ??
//3.得到服務(wù)器數(shù)據(jù)? ??
NSData*data=[NSURLConnection sendSynchronousRequest: request returningResponse: respone error: error];? ??
if(data==nil)? ? {? ? ? ? NSLog(@"登陸失敗:%@,請(qǐng)重試",error);? ? ? ? return;? ? }?
/*? ? ? ? 4.對(duì)服務(wù)器獲取的數(shù)據(jù)data進(jìn)行相應(yīng)的處理;? */
2.異步get方法:
異步請(qǐng)求與同步請(qǐng)求的不同在于使用NSURLConnectionDataDelegate委托協(xié)議,指定代理.
@interface ViewController : UIViewController // 遵循協(xié)議
@property (weak,nonatomic) NSMutableData *receiveData;? //創(chuàng)建一個(gè)可變data,用于異步接收服務(wù)器的數(shù)據(jù)
@end
創(chuàng)建網(wǎng)絡(luò)請(qǐng)求:
//1.創(chuàng)建一個(gè)web路徑
NSString*webPath=[NSString stringWithFormat: @";pass=%@btn=login",yourname,yourpass];
webPath=[webPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL? *url=[NSURL URLWithString:webPath];
//2.根據(jù)WEB路徑創(chuàng)建一個(gè)請(qǐng)求
NSURLRequest *request=[NSURLRequest requestWithURL:url];
//3.指定代理 以異步的方式接收數(shù)據(jù)NSURLConnectionDataDelegate
NSURLConnection? *con=[NSURLConnection connectionWithRequest:request delegate:self];
if(con==nil)
{
NSLog(@"創(chuàng)建連接失敗.");
return;
}
else//成功 準(zhǔn)備接數(shù)據(jù)
{
if(self.receiveData==nil)
{
self.receiveData=[[NSMutableData alloc] init];
}
}
異步的代理行為:
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{? ??
NSLog(@"已經(jīng)響應(yīng)成功.");
//清空 為當(dāng)前連接做準(zhǔn)備? ??
self.receiveData.length=0;
}
-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{? ? NSLog(@"已經(jīng)接收到了數(shù)據(jù).");? ??
//追加接收到的數(shù)據(jù)? ??
[self.receiveData appendData:data];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection{? ??
NSLog(@"接收數(shù)據(jù)已經(jīng)完成.");?
/*? ? ? 對(duì)服務(wù)器獲取的數(shù)據(jù)receiveData進(jìn)行相應(yīng)的處理;? */
}
-(void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{? ? NSLog(@"連接失敗.");
}
二、POST方法
1.同步post方法:
//1.創(chuàng)建一個(gè)web路徑? ??
NSString? *webPath=@""; ??
webPath = [webPath stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];? ? NSURL *url=[NSURL URLWithString:webPath];
//2.建立一個(gè)帶協(xié)議緩存類型的請(qǐng)求 (使用NSMutableURLRequest,是post方法的關(guān)鍵)? ? NSMutableURLRequest? *request=[NSMutableURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:10];? ? ? ? //3.設(shè)置表單提交的方法(默認(rèn)為get)? ? [request setHTTPMethod: @"post"];
//4.設(shè)置要提交的參數(shù)? ? NSString? *args=[NSString stringWithFormat:@"uname=%@upas=%@btn=login",uname,upas];? ? [request setHTTPBody: [args dataUsingEncoding:NSUTF8StringEncoding]];
NSData *recvData=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];? ? if(recvData!=nil)? ? {
/*
對(duì)服務(wù)器獲取的數(shù)據(jù)recvData進(jìn)行相應(yīng)的處理
*/
}
else
{
NSLog(@"連接失敗,請(qǐng)重試!");
}
2.post方法的異步與同步的區(qū)別在于使用NSURLConnectionDataDelegate委托協(xié)議,指定代理.
這一點(diǎn)與get方法一致,所以就不進(jìn)行長(zhǎng)篇幅的演示了。
以上就是關(guān)于部分網(wǎng)絡(luò)同步異步請(qǐng)求,get、post請(qǐng)求方法的演示,由于UI控件還有其他的處理沒有附上,具體的讀者可以進(jìn)行相應(yīng)細(xì)節(jié)的調(diào)整,進(jìn)行完整的網(wǎng)絡(luò)請(qǐng)求項(xiàng)目開發(fā)。
由于iOS開始,引入了新的網(wǎng)絡(luò)接口NSURLSession,而在iOS9中NSURLConnection被宣布棄用,因此關(guān)于NSURLSession發(fā)送GET和POST請(qǐng)求的資料部分,有興趣的可以參考:
iOS開發(fā) GET、POST請(qǐng)求方法(NSURLSession篇)
? by:啊左~
1.什么是 cookie?cookie 和 token 有何區(qū)別?
cookie 是什么呢?cookie 在英語中通常是指餅干,當(dāng)然,我這里指的不是,而是 HTTP 網(wǎng)絡(luò)請(qǐng)求中用來記錄用戶信息的一種數(shù)據(jù)形式或者說一種機(jī)制。
cookie :在客戶端發(fā)送登錄操作的網(wǎng)絡(luò)請(qǐng)求時(shí),服務(wù)器在登陸成功返回的 response header 中會(huì)添加一個(gè) set-cookie 的值,作為用戶的身份認(rèn)證,如果是瀏覽器的話,后面每一次發(fā)請(qǐng)求時(shí),瀏覽器都會(huì)自動(dòng)將之前獲取到的 cookie 值插入到 request header 的 cookie 字段中,而且 cookie 本身包括多個(gè)屬性,比如有效期 expires、域 domain等,因此采用 cookie 的登錄機(jī)制需要考慮到對(duì) cookie 本身的管理。cookie 主要是在 web 領(lǐng)域使用。
token :相比 cookie,token 令牌的登錄機(jī)制要更輕,直觀的感受是,登錄認(rèn)證成功后,服務(wù)器返回 token 值,然后在請(qǐng)求的 url 中拼接一段 “token=%^%#%#” 就完事了,至于什么跨域、安全策略什么的,根本沒他什么事,客戶端管理 token 也非常簡(jiǎn)單,只要看好這個(gè)字符串就行了,所以 token 一般在移動(dòng)端用的比較多。當(dāng)然,移動(dòng)應(yīng)用中的 web view 還是要處理 cookie 的。
2.iOS 中的網(wǎng)絡(luò)請(qǐng)求中如何處理 cookie?
在開始處理 cookie 時(shí),需要了解兩個(gè)類,NSHTTPCookie 和 NSHTTPCookieStorage,在用的時(shí)候要注意幾點(diǎn):
下面切入正題吧,我是如何做的呢?
首先是登錄。登錄成功后,服務(wù)器在 HTTP response header 中的 set-cookie 字段中返回了 cookie 的值,我們可已通過多種方式獲取到我們想要的 cookie 值,我是采用了下面這種方式來讀取的,因?yàn)槲覀兊姆?wù)器沒有設(shè)置 expireDate,所以我就自己做持久化存儲(chǔ)了。
然后是請(qǐng)求時(shí)添加 cookie 到 request header。實(shí)際上這一步系統(tǒng)(NSURLSession / NSURLConnection)已經(jīng)自動(dòng)幫我們處理了,具體細(xì)節(jié)我也不太清楚。
還要考慮重啟應(yīng)用后的操作,由于我們的服務(wù)器沒有設(shè)置 expireDate 以及上面提到的其他原因,在程序重啟時(shí),NSHTTPCookieStorage 并不會(huì)保存上一次使用應(yīng)用時(shí)的 cookie,所以我們需要在程序啟動(dòng)時(shí)讀取自己保存的 cookie,同時(shí)更新 NSHTTPCookieStorage 的 cookie。
關(guān)于 cookie 的有效期處理,在使用 cookie 時(shí)需要自己判斷 cookie 是否過期,NSHTTPCookieStorage 是不會(huì)自動(dòng)幫我們處理的,更何況我們自己還做了本地存儲(chǔ),所以我們?cè)谟玫?cookie 時(shí)還需要檢查 cookie 是否過期,如果過期了,就要廢棄掉失效的 cookie。我是在用戶的登錄狀態(tài)方法中做的處理:
最后還要記得在退出登錄時(shí)也要?jiǎng)h除 cookie:
3.iOS 中的原生網(wǎng)絡(luò)請(qǐng)求如何與 webView 實(shí)現(xiàn) cookie 共享?
遺留問題:
1.服務(wù)器是在什么時(shí)候更新/生成cookie ?
2.登陸成功后,系統(tǒng)是如何自動(dòng)添加 cookie 到 request header 中去的?
3.服務(wù)器是怎么識(shí)別客戶端的 cookie 的?
翻遍百度沒事找到合適的參考文章,最終找到了這篇以圖片加載講解隊(duì)列的文章
1、保存請(qǐng)求的類
2、隊(duì)列,及隊(duì)列中Operation實(shí)現(xiàn)
3、網(wǎng)絡(luò)請(qǐng)求
4、viewController里發(fā)起網(wǎng)絡(luò)請(qǐng)求
5、請(qǐng)求結(jié)果
失敗時(shí)
成功時(shí)
基本解決了文章開頭提出的問題。
有什么改進(jìn)意見或者好的想法,歡迎大家提出。
網(wǎng)站標(biāo)題:ios開發(fā)網(wǎng)絡(luò)請(qǐng)求,ios網(wǎng)絡(luò)請(qǐng)求加密
文章位置:http://chinadenli.net/article35/dsejspi.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、網(wǎng)站設(shè)計(jì)、網(wǎng)站內(nèi)鏈、網(wǎng)站改版、品牌網(wǎng)站制作、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)