ASIHTTPRequest使用

http://qk13warcraft.blog.163.com/blog/static/157549344201271633014969/

一、建立和運行請求
建立一個同步請求

這是最簡單的用法,發送 startSynchronous 消息將在相同線程中執行請求,無論是否成功,完成後返回控制。
查看error屬性以檢測問題。
要以字符串形式獲得響應,就調用responseString方法。這個方法不適合二進制數據 - 你應該使用responseData 獲得NSData對象,或者若是有更大的文件,你能夠設置downloadDestinationPath將請求下載到文件。

- (IBAction)grabURL:(id)sender {   ios

NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];   git

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];   github

[request startSynchronous];   web

NSError *error = [request error];   apache

if (!error) {     json

NSString *response = [request responseString];   windows

} api

}瀏覽器

注意:通常的,你應該優先使用異步請求,若是你在主線程中使用ASIHTTPRequest的同步方法,程序的ui在請求過程當中將被鎖定而沒法響應。


二、建立一個異步請求
下面的代碼作一樣的事情,但請求運行於後臺。

- (IBAction)grabURLInBackground:(id)sender {     緩存

NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];  

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];    

[request setDelegate:self];    

[request startAsynchronous];

} - (void)requestFinished:(ASIHTTPRequest *)request {  

// Use when fetching text data    

NSString *responseString = [request responseString];    

// Use when fetching binary data    

NSData *responseData = [request responseData];

} - (void)requestFailed:(ASIHTTPRequest *)request {  

NSError *error = [request error];

}


注意咱們設置請求的委託,這樣就能在請求完成或失敗時獲得通知。
這是建立異步請求最簡單的方式,他會運行於場景後面的一個全局的NSOperationQueue中,對於更復雜的操做,例如在多個請求中追蹤進展,你可能想要建立本身的隊列,下面咱們談談這個。

三、使用程序塊(blocks)
對於v1.8,咱們能夠在支持程序塊的平臺使用他們:

- (IBAction)grabURLInBackground:(id)sender {  

 NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];    

__block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];    

[request setCompletionBlock:^{       

// Use when fetching text data       

NSString *responseString = [request responseString];       

// Use when fetching binary data     

NSData *responseData = [request responseData];  

 }];

   [request setFailedBlock:^{     

 NSError *error = [request error];  

 }];    

[request startAsynchronous];

}

注意:在咱們聲明請求時,用到了__block限定語,這很重要!它告訴block不要保留請求,來防止一個保留循環(retain-cycle),由於請求總會保留block.

四、使用隊列
這個例子作一樣的事,不一樣的是,咱們爲本身的請求建立了NSOperationQueue。

使用一個NSOperationQueue或者ASINetworkQueue,你能更有效的控制異步請求。咱們使用一個請求,只有必定數量的請求能同時 運行。若是你添加多於maxConcurrentOperationCount數量的請求,這些請求將等到其餘請求完成後纔會開始。

- (IBAction)grabURLInTheBackground:(id)sender {    

if (![self queue]) {     

 [self setQueue:[[[NSOperationQueue alloc] init] autorelease]];    

}    NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];  

 ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];    

[request setDelegate:self];    

[request setDidFinishSelector:@selector(requestDone:)];    

[request setDidFailSelector:@selector(requestWentWrong:)];    

[[self queue] addOperation:request];

//queue is an NSOperationQueue

} - (void)requestDone:(ASIHTTPRequest *)request {  

 NSString *response = [request responseString];

} - (void)requestWentWrong:(ASIHTTPRequest *)request {    

NSError *error = [request error];

}


在上面的例子中,'queue'是控制器的一個保留的NSOperationQueue屬性。

咱們設置自定義的selector處理成功或失敗的回調。若是你不設置這些,默認的requestFinished和requestFailed將被使用,就像在以前的例子中同樣。

在委託方法中處理對歌請求的成功和失敗
若是你須要處理許多不一樣類型的請求,你有幾個選擇:
       1. 若是你的請求都屬於一個大的範圍,你又想區別他們,能夠設置請求的userInfo字典屬性,填入你的自定義數據,你就能夠在委託方法中讀取了。在更簡單的用例中,你能夠簡單的設置tag屬性。這些屬性都是給你本身用的,不會發送到服務器。
       2. 若是你處理徹底不一樣的請求,爲每一個請求設置不一樣的 setDidFinishSelector / setDidFailSelector。
       3. 對更復雜的狀況,或者你想在後臺解析響應數據,能夠爲每一個請求類型建立一個ASIHTTPRequest的子類,而後重載requestFinished: 和 failWithError: 。
       注意:最好避免在委託方法中,用url來區分不一樣的請求,由於url屬性在重定向時會改變。若是你真的真的想用的話,請用[request originalURL] 代替,這個將老是記錄第請求鏈接時的首個url。

五、關於ASINetworkQueues

ASINetworkQueues是NSOperationQueue,它提供了額外的功能。
它的主要目的是追蹤整個隊列上傳或下載的進度。
ASINetworkQueues提供了一些額外的委託方法selector。
requestDidStartSelector
每當隊列中的一個請求開始運行時調用。你可使用這個做爲didStartSelector的替代方法,爲你加到隊列的請求設置一個委託。

requestDidReceiveResponseHeadersSelector
每當隊列中的一個請求從服務器獲得響應頭時調用。對於大的下載,這個 selector有時在請求實際完成前執行。
你可使用它做爲對didReceiveResponseHeadersSelector的替代。

requestDidFinishSelector
每當隊列中的一個請求完成時調用。可使用它做爲對didFinishSelector的替代。

requestDidFailSelector
每當隊列中的請求失敗時調用,可做爲didFailSelector的替代。

queueDidFinishSelector
當隊列完成時調用,無論單個請求成功或失敗。

使用以上selector,要將隊列的委託,而不是請求的委託,設置到實現這些selector所表明的方法的控制器。

ASINetworkQueues工做起來和NSOperationQueues稍有不一樣,加到其中的請求不會馬上運行,當使用 ASINetworkQueue時,添加你想運行的全部請求,而後調用[queue go]。當你啓動一個隊列,將精確進度(accurate progress)打開時,他會首先爲隊列中全部的get請求執行一個head請求,來獲得將要下載數據的整體尺寸。得到此數據後,它就能準確的顯示整體 進度,而後真實的請求才會開始。
問題:當你向一個運行中的ASINetworkQueue加入一個請求時發生了什麼事情?
回答:若是你使用ASINetworkQueue來追蹤幾個請求的整體進度,總體進度只會在哪一個請求開始執行時,纔會將它計算在內。 ASINetworkQueue不會在運行中,當加入請求後執行head請求,因此若是你馬上向運行的隊列加入許多請求,整體進度不會馬上更新。
若是隊列已經運行,你不須要再次調用[queue go]。

當ASINetworkQueue中的一個請求失敗,隊列默認的將取消全部其餘的請求。你能夠調用[queue setShouldCancelAllRequestsOnFailure:NO].來關閉這一行爲。
ASINetworkQueues只能執行ASIHTTPRequest操做,而不能用於通常操做,嘗試添加一個非ASIHTTPRequest的NSOperation將產生一個異常。
提示:這裏有一個建立和使用ASINetworkQueue的完整例子:
http://gist.github.com/150447

六、取消一個異步請求
爲了取消一個異步請求,能夠調用[request cancel],無論該請求是用[request startAsynchronous] 啓動的,仍是在你建立的隊列中運行。注意你不能取消一個同步請求。
注意,當你取消一個請求,請求會將之視爲一個錯誤,而後會調用你的委託或者隊列的失敗委託方法。若是你不想這種事發生,在取消以前將委託設爲nil,或者使用clearDelegatesAndCancel做爲代替。

// Cancels an asynchronous request

[request cancel] // Cancels an asynchronous request, clearing all delegates and blocks first

[request clearDelegatesAndCancel];


當使用一個ASINetworkQueue時,你取消其中一個請求,全部其餘的請求也會被取消,除非隊列的shouldCancelAllRequestsOnFailure爲no, 默認爲yes。

// When a request in this queue fails or is cancelled, other requests will continue to run

[queue setShouldCancelAllRequestsOnFailure:NO];

// Cancel all requests in a queue

[queue cancelAllOperations];


七、
安全處理委託在請求完成前釋放的狀況

請求不會保留他們的委託,因此若是你的委託有機會在請求運行時釋放的話,你能及時清理請求的委託屬性是相當重要的。在大多數狀況下,若是你的委託將要釋放,你大概也想取消請求,由於你再也不關心請求的狀態。

在下面的例子中,控制器有一個保存於保留實例變量中的ASIHTTPRequest對象。咱們在其dealloc實現中調用clearDelegatesAndCancel方法,在咱們釋放請求的引用以前:

// Ddealloc method for our controller

- (void)dealloc {  

 [request clearDelegatesAndCancel];    

[request release];    

..    

[super dealloc];

}


八、發送數據

發送請求頭
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request addRequestHeader:@"Referer" value:@"http://allseeing-i.com/"];


用ASIFormDataRequest發送一個表單

要以兼容web頁表單的方式發送post數據,可使用ASIFormDataRequest的子類。數據以‘application/x-www- form-urlencoded’格式寄出,或者用‘multipart/form-data’格式上傳二進制數據或文件。文件中的數據按照須要從磁盤讀 取,因此發送大文件是沒問題的,只要你的web服務器設置瞭如何處理他們。
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:@"Ben" forKey:@"first_name"];
[request setPostValue:@"Copsey" forKey:@"last_name"];
[request setFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photo"];


ASIFormDataRequest使用setFile:forKey:添加文件時將自動偵測文件的mime類型(ios3.0以後),幷包含這個到發送到服務器的mime頭部中。若是你願意,你可使用更長的重載形式:
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

// Upload a file on disk
 
[request setFile:@"/Users/ben/Desktop/ben.jpg" withFileName:@"myphoto.jpg" andContentType:@"image/jpeg"
forKey:@"photo"];


// Upload an NSData instance
[request setData:imageData withFileName:@"myphoto.jpg" andContentType:@"image/jpeg" forKey:@"photo"];


你能夠爲同一個參數發送多個值使用其餘的add api:
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request addPostValue:@"Ben" forKey:@"names"];
[request addPostValue:@"George" forKey:@"names"];
[request addFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photos"];
[request addData:imageData withFileName:@"george.jpg" andContentType:@"image/jpeg" forKey:@"photos"];


參考ASIFormDataRequest.h,瞭解添加到你post的參數的全部方法的完整列表。

九、put方法和自定義post
若是你想經過put發送數據,或者想要發送post,可是想本身建立post數據體(body),使用appendPostData: 或者 appendPostDataFromFile:。

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request appendPostData:[@"This is my data" dataUsingEncoding:NSUTF8StringEncoding]];
// Default becomes POST when you use appendPostData: / appendPostDataFromFile: / setPostBody:
[request setRequestMethod:@"PUT"];


若是你想發送大量的數據,而且不用ASIFormDataRequest,參看後面的‘從磁盤以流式post數據’小節。

十、下載數據

將響應數據直接下載爲文件

若是你請求的數據至關大,你能夠直接將下載內存直接保存爲文件。這樣,ASIHTTPRequest不須要一次在內存中保存整個請求。

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadDestinationPath:@"/Users/ben/Desktop/my_file.txt"];


當使用downloadDestinationPath下載到文件時,下載過程當中,數據將被保存在一個臨時文件中。這個文件路徑保存於temporaryFileDownloadPath。當請求成功完成,下面的事情之一會發生:

若是數據時gzip壓縮過的,壓縮文件將被解壓到downloadDestinationPath,而且臨時文件被刪除;
若是數據沒被壓縮,臨時文件移動到downloadDestinationPath,覆蓋掉任何以前的文件。

注意:若是響應body是空的,文件是不會被建立的。因此若是請求可能返回一個空的body,你要肯定在嘗試操做文件以前,檢查它是否存在

十一、處理收到的響應數據

若是你須要處理收到的響應數據,好比你想使用流解析器(streaming parser)來解析仍在下載的響應數據,就須要在委託中實現request:didReceiveData:方法。注意當你這麼作 時,ASIHTTPRequest不會產生responseData,也不會將數據寫入downloadDestinationPath - 你必須本身搞定保存響應數據的事。

讀取HTTP狀態碼
ASIHTTPRequest 不會鳥大多數的http狀態碼,重定向和驗證的狀態碼除外。因此,就要靠你檢查問題,好比404錯誤,而後肯定你作了恰當的處理。

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
int statusCode = [request responseStatusCode];
NSString *statusMessage = [request responseStatusMessage];



讀取響應頭
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
NSString *poweredBy = [[request responseHeaders] objectForKey:@"X-Powered-By"];
NSString *contentType = [[request responseHeaders] objectForKey:@"Content-Type"];



處理文本編碼
ASIHTTPRequest會嘗試從Content-Type頭獲得數據的編碼。若是它發現了一個編碼類型,他會社子responseEncoding 爲相應的NSStringEncoding。若是它沒在頭部發現編碼信息,就會用defaultResponseEncoding,這個值默認爲 NSISOLatin1StringEncoding。
當你調用[request responseString],ASIHTTPRequest將嘗試用responseEncoding做爲源編碼,從收到的數據建立一個字符串。

處理重定向
當ASIHTTPRequest碰到如下http狀態碼時,會自動重定向到一個新的url,假設Location頭已經發送:
301 永久移動
302 發現
303 參看其餘
當重定向發生,響應數據(responseHeaders / responseCookies / responseData / responseString 等) 的值將反映從最終位置收到的內容。
在重定向週期中碰到的任何url上設置的Cookie,都倍存儲到全局cookie倉庫,在恰當的時候會由重定向請求呈現給服務器。
你能夠關閉自動重定向,設置shouldRedirect屬性爲no便可。

注意:默認狀況下,自動重定向老是以get方式進行請求(沒有body)。這個行爲複合大多數的瀏覽器,除了象301和302這樣應該用原有方式重定向的規範。
爲了保留301和302的原有方式(包含請求的body),須要將shouldUseRFC2616RedirectBehaviour設置爲yes,在你開始請求以前。

十二、跟蹤進度

每一個ASIHTTPRequest都有兩個用於跟蹤進度的委託 - downloadProgressDelegate用於下載,uploadProgressDelegate用於上傳。
進度委託能夠是NSProgressIndicators(Mac OS X)或者UIProgressViews(iPhone)。ASIHTTPRequest會自動適應這二者行爲上的差別。你也可以使用自定義的類做爲進度 委託,只要它響應setProgress:方法。

若是你正執行單個請求,在這個請求上設置一個上傳或下載委託。
若是你在隊列中執行多個請求,而且想跟蹤隊列中全部請求的整體進度,可使用ASINetworkQueue並設置隊列的進度委託
若是想同時作上面兩件事,也是可行的。

重點注意:若是你正在向須要驗證的站點進行上傳操做,爲了提供有效驗證,每當上傳失敗時,進度會被重設爲以前的值。爲此,若是你正同驗證web服務器通 信,建議你僅當useSessionPersistence爲yes時使用上傳進度委託,並確保你在嘗試跟蹤大量上傳數據前,在另外一個請求中驗證。

當請求body小於128kb時,目前是不可以跟蹤上傳進度的。對請求大於128kb的請求,進度委託不會收到第一個128kb的post數據進度的信息。這是由於CFNetwork API的限制形成的。
2009.6.21日更新:apple的好傢伙很是友好的定位了個人bug報告!在iphone 2.0 sdk中,貌似這個緩衝尺寸減少到了32kb,這讓精確的上傳進度跟蹤更加可靠了。

1三、跟蹤單個請求的下載進度

在這個例子中,myProgressIndicator是一個NSProgressIndicator。

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadProgressDelegate:myProgressIndicator];
[request startSynchronous];
NSLog(@"Max: %f, Value: %f", [myProgressIndicator maxValue],[myProgressIndicator doubleValue]);


跟蹤一組請求的下載進度

這個例子中,myProgressIndicator 是一個UIProgressView,myQueue是一個ASINetworkQueue。
- (void)fetchThisURLFiveTimes:(NSURL *)url
{
   [myQueue cancelAllOperations];
   [myQueue setDownloadProgressDelegate:myProgressIndicator];
   [myQueue setDelegate:self];
   [myQueue setRequestDidFinishSelector:@selector(queueComplete:)];
   int i;
   for (i=0; i<5; i++) {
      ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
      [myQueue addOperation:request];
   }
   [myQueue go];
}

- (void)queueComplete:(ASINetworkQueue *)queue
 
{
   NSLog(@"Value: %f", [myProgressIndicator progress]);
}


注意對於ASINetworkQueues,咱們必須調用[myQueue go]來啓動隊列。

跟蹤單個請求的上傳進度

本例中,myProgressIndicator是一個UIProgressView。
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:@"Ben" forKey:@"first_name"];
[request setPostValue:@"Copsey" forKey:@"last_name"];
[request setUploadProgressDelegate:myProgressIndicator];
[request startSynchronous];
NSLog(@"Value: %f",[myProgressIndicator progress]);


跟蹤一組請求的上傳進度

本例中,myProgressIndicator是一個NSProgressUbdicator,myQueue是一個ASINetworkQueue。
- (void)uploadSomethingFiveTimes:(NSURL *)url
{
   [myQueue cancelAllOperations];
   [myQueue setUploadProgressDelegate:myProgressIndicator];
   [myQueue setDelegate:self];
   [myQueue setRequestDidFinishSelector:@selector(queueComplete:)];
   int i;
   for (i=0; i<5; i++) {
      ASIHTTPRequest *request = [ASIFormDataRequest requestWithURL:url];
      [request setPostBody:[@"Some data" dataUsingEncoding:NSUTF8StringEncoding]];
      [myQueue addOperation:request];
   }
   [myQueue go];
}

- (void)queueComplete:(ASINetworkQueue *)queue
 
{
   NSLog(@"Max: %f, Value: %f", [myProgressIndicator maxValue],[myProgressIndicator doubleValue]);
}

1四、

精確進度vs簡單進度

ASIHTTPRequest提供了兩種顯示進度的途徑,簡單進度 和 精確進度。他們由ASIHTTPRequests 和 ASINetworkQueues的showAccurateProgress來控制。若是你在一個請求上設置 showAccurateProgress,只會影響這個請求。若是你設置了隊列,將影響到隊列的所有請求。

簡單請求
當你使用簡單進度,進度僅在請求完成時更新。對於單個進程,你只能獲得0%和100%完成。對於一個包括4個請求的隊列,你能獲得5次進度更新,0%,25%,50%,75%和100%,每一次增量代表有一個請求完成了。
簡單進度(showAccurateProgress = NO)是ASINetworkQueues的默認值,它很好的適用於包含大量的輕量級上傳/下載請求的隊列。

精確進度
使用精確進度時,進度以收發的字節來更新,因此極適合收發大量數據的請求,它會更好的指示一個耗時請求收發了多少數據。
使用精確進度會稍稍下降上傳操做的性能,由於進度委託(多是UIProgressView或者NSProgressIndicator)將更爲頻繁的重繪。
使用精確進度會對使用隊列的下載任務影響更大,由於隊列在下載前,會先爲其中的get請求執行head請求,來決定將要下載的數據整體尺寸。強烈推薦你在隊列中下載大文件時使用精確進度,可是應該避免隊列中包含大量小型下載時使用它。
精確進度(showAccurateProgress = YES)是ASIHTTPRequests執行同步任務時的默認值。

1五、
自定義進度跟蹤

ASIProgressDelegate協議定義了獲得請求的更新進度的委託的全部方法。大多數狀況下,爲NSProgressIndicator或 UIProgressView設置uploadProgressDelegate 或 downloadProgressDelegate就足夠了。可是,若是你想作更復雜的進度跟蹤,你的進度委託應該優先於setProgress: (iOS) 或者setDoubleValue: / setsos5403: (Mac)實現下列方法。這些方法容許你獲得收發的實際字節數,而不是更簡單的方法獲得的介於0和1之間的數字。
downloadProgressDelegates的方法

request:didReceiveBytes:每當請求下載更多數據時在downloadProgressDelegate上調用。注意這有別於通常會實現的request:didReceiveData:委託。
request:incrementDownloadSizeBy:下載尺寸改變時被調用,傳入的參數是下載尺寸的增量。通常發生在請求收到響應頭並得到了下載的尺寸時。

uploadProgressDelegates的方法

request:didSendBytes: 每當請求能發送一些數據時在uploadProgressDelegate上調用。重點提醒:這個方法能被小於0的數字調用,當一個請求須要刪除上傳進度 時(通常是當它已經上傳了數據,可是驗證失敗或者因爲某種緣由須要再次運行時)。
request:incrementUploadSizeBy: 上傳尺寸改變時調用。傳入的尺寸常常會小於0,因爲請求調整了上傳尺寸,它將os內部的緩衝尺寸也計算在內了。

1六、
處理http驗證
若是你正在鏈接到須要驗證的服務器,你大概想要看看這個流程圖
http://allseeing-i.com/ASIHTTPRe ... ticationProcess.pdf
,演示了ASIHTTPRequest如何找到和應用請求驗證。

在url中指定用戶名和密碼
NSURL *url = [NSURL URLWithString:@"http://username:password@allseeing-i.com/top_secret/"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];


設置請求的用戶名和密碼
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com/top_secret/"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setUsername:@"username"];
[request setPassword:@"password"];

1七、
在鍵鏈(keychain)中儲存證書
若是你打開了keychainPersistence,任何你提供的有效用戶名和密碼將被存儲到鍵鏈中。隨後的請求會重用鍵鏈中的用戶名和密碼,即便你退出再重啓應用。
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com/top_secret/"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setUseKeychainPersistence:YES];
[request setUsername:@"username"];
[request setPassword:@"password"];


若是你使用鍵鏈同時但願本身管理它,你應該能在ASIHTTPRequest.h中找到有助於此與鍵鏈相關的類方法。

1八、
在會話中保存證書
若是useSessionPersistence打開了,默認是打開的,ASIHTTPRequest將證書保存到內存,並能夠在後續請求中重用他們。
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com/top_secret/"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setUsername:@"username"];
[request setPassword:@"password"];
[request setUseSessionPersistence:YES]; //Shouldn't be needed as this is the default

//Should reuse our username and password
 
request = [ASIHTTPRequest requestWithURL:url];

1九、
NTML驗證
要經過使用ntml方案的windows服務器進行驗證,你還須要指定你驗證的域(domain)。
NSURL *url = [NSURL URLWithString:@"http://my.windows.server/top_secret/"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setUsername:@"username"];
[request setPassword:@"password"];
[request setDomain:@"my-domain"];


使用委託來提供證書
相對於提早指定驗證證書,你可能更願意在請求不能從會話驗證緩存或鍵鏈中獲得證書時,向它的委託詢問。這可能有助於你但願連到一個服務器,但你不肯定它須要哪一種類型的驗證。
肯定你的委託實現了authenticationNeededForRequest,ASIHTTPRequest會暫停一個請求,當它等待一個委託以獲 得將要使用的證書時。當你有你須要的證書時,只要在請求上設置他們,而後調用[request retryUsingSuppliedCredentials],若是你想取消,就要調用[request cancelAuthentication],這也會取消請求。

對於v1.0.8,請求的委託一次只會收到一個authenticationNeededForRequest或者 proxyAuthenticationNeededForRequest。當委託處理第一個請求時,其餘須要驗證的請求會暫停執行。若是證書經過驗證, 任何當前進程的其餘請求都會嘗試重用他們,假設他們對url有效。若是委託取消了驗證,且隊列的 shouldCancelAllRequestsOnFailure爲yes,全部其餘的請求再也不嘗試查詢證書而會取消。

在使用同步請求時,你不能使用代理模式進行驗證。
在老版本中這會致使應用掛起,對於v1.0.8代理方法再也不被調用。

20、使用內置驗證對話框(目前僅ios可用)

在v1.0.8中新增了ASIAuthenticationDialog類。它主要用來和驗證代理一同工做,可是它能夠被用來爲驗證web服務器詢問用戶的證書。
爲了最好的用戶體驗,多數連到單個服務的應用應該在其委託中實現authenticationNeededForRequest:,或者避免徹底的使用委 託樣式(delegate-style)驗證。可是有時爲常規驗證而使用ASIHTTPRequest的標準驗證對話框有些好處:

你不想建立你本身的登陸表單
你大概須要從外部來源得到數據,而不太肯定它需不須要驗證。

爲此,在請求中設置shouldPresentAuthenticationDialog爲true,若是你的委託沒有實現authenticationNeededForRequest,用戶將看到此對話框。

驗證對話框不會在同步請求時出現。

對話框有點模仿了iphone上的safari,幷包括:
一條消息指明這個認證是爲web服務器作的(而不是代理)
你鏈接到的服務器的主機名或ip
驗證域(authentication realm),若是支持的話
輸入用戶名和密碼的文本框
當鏈接到一個使用ntlm方案的服務器時,對話框也包括一個輸入域(domain)的文本框
關於驗證是否以明文(plain text)發送的提示(僅在用無ssl的基本驗證時才被明文發送)。

若是你想改變對話框的外觀,子類化ASIHTTPRequest,重載showAuthenticationDialog來顯示你本身的自定義對話框或者子類化ASIAuthenticationDialog。

2一、在服務器要求以前提供證書
很是重要:在v1.0.8中,使用基本驗證的請求時,這個特徵改變了,你可能須要更新你的代碼。

ASIHTTPRequest能夠在首次請求時就爲服務器提供證書,而不是等到服務器要求證書。結果是使用驗證時得到更好的性能,由於它避免了額外的請求。

使用基本驗證來觸發此行爲時,你應該手動設置請求的authenticationScheme:
[request setAuthenticationScheme:(NSString *)kCFHTTPAuthenticationSchemeBasic];

使用其餘驗證方案時,證書能夠在服務器要求以前提供,但只有在另外一個請求成功經過此服務器驗證以後。

你可能但願禁用此特徵,若是:
你的應用可能使用多組證書來同時和同一個服務器對話。
你的應用是安全至上的,使用這個特性自己不太安全,由於在你有機會驗證你鏈接到你但願鏈接的服務器以前,證書已經被髮送了。

爲了禁用此特徵,使用如下代碼:
[request setShouldPresentCredentialsBeforeChallenge:NO];

2二、
Cookies
持久化cookies

ASIHTTPRequest容許你使用全局存儲,全局存儲爲全部max os上使用CFNetwork或NSURLRequest API的應用所共享。若是useCookiePersistence爲on(默認如此),cookies將被保存到共享的 NSHTTPCookieStorage容器中,並自動被其餘請求自動重用。若是cookie僅對特定請求有效,ASIHTTPRequest提供其餘程 序建立的cookie是沒有價值的。
你能夠象這樣清除在會話中建立的全部cookie:
[ASIHTTPRequest setSessionCookies:nil];

這裏,'會話cookie'指的一個會話中建立的全部cookie,而不是程序退出時被刪除的無過時時間的cookie(常常被稱爲會話cookie)。

另外,類的方便(convenience)方法clearSession將清除全部會話中建立的cookie,以及任何緩存的驗證數據。


手工處理cookie
若是你喜歡,你能夠關掉useCookiePersistence,而後手動管理特定請求的一組cookie。

//Create a cookie
NSDictionary *properties = [[[NSMutableDictionary alloc] init] autorelease];
[properties setValue:[@"Test Value" encodedCookieValue] forKey:NSHTTPCookieValue];
[properties setValue:@"ASIHTTPRequestTestCookie" forKey:NSHTTPCookieName];
[properties setValue:@".allseeing-i.com" forKey:NSHTTPCookieDomain];
[properties setValue:[NSDate dateWithTimeIntervalSinceNow:60*60] forKey:NSHTTPCookieExpires];
[properties setValue:@"/asi-http-request/tests" forKey:NSHTTPCookiePath];
NSHTTPCookie *cookie = [[[NSHTTPCookie alloc] initWithProperties:properties] autorelease];
 
//This url will return the value of the 'ASIHTTPRequestTestCookie' cookie
url = [NSURL URLWithString:@"http://allseeing-i.com/ASIHTTPRequest/tests/read_cookie"];
request = [ASIHTTPRequest requestWithURL:url];
[request setUseCookiePersistence:NO];
[request setRequestCookies:[NSMutableArray arrayWithObject:cookie]];
[request startSynchronous];
 
//Should be: I have 'Test Value' as the value of 'ASIHTTPRequestTestCookie'
NSLog(@"%@",[request responseString]);


2三、
處理壓縮的響應,以及壓縮請求body

使用gzip來處理壓縮的響應數據

對於v0.9,ASIHTTPRequest不會提醒服務器它能夠接受gzip壓縮格式數據。若是你在現有項目中升級ASIHTTPRequest,參看設置指令地址
http://allseeing-i.com/ASIHTTPRequest/Setup-instructions
瞭解如何連接到zlib。

許多web服務器能夠在發送數據前進行壓縮 - 這樣能夠加快下載和下降使用帶寬,代價是服務器(用以壓縮數據)和客戶端(解壓數據)增長了額外的cpu時間。通常說來,只有某些類型的數據會被壓縮 - 許多二進制格式例如jpeg,gif,png,swf和pdf已經壓縮過他們的數據,因此gzip壓縮不會用於發送他們到客戶端。文本文件如網頁和xml 文檔是gzip壓縮的完美候選人,由於他們常常包含大量重複信息。

如何設置apache使用mod_deflate來壓縮數據
apatche 2.x 以後帶來了mod_deflate擴展容許透明的壓縮某些類型的數據。要打開他,你須要在apatche配置文件中啓用mode_deflate,並添加mod_deflate指令到你的虛擬主機配置中,或者到你的.htaccess文件中。

在ASIHTTPRequest中使用gzip

- (IBAction)grabURL:(id)sender
{
  NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
  ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
  // YES is the default, you can turn off gzip compression by setting this to NO
  [request setAllowCompressedResponse:YES];
  [request startSynchronous];
  BOOL *dataWasCompressed = [request isResponseCompressed]; // Was the response gzip compressed?
  NSData *compressedResponse = [request rawResponseData]; // Compressed data
  NSData *uncompressedData = [request responseData]; // Uncompressed data
  NSString *response = [request responseString]; // Uncompressed data as a string
}



當allowCompressedResponse爲真,ASIHTTPRequest將添加Accept-Encoding頭到請求中,代表咱們能夠接 受gzip壓縮的響應數據。若是響應頭包含一個content-encoding頭指明瞭數據已被壓縮,調用responseData 或者 responseString將在返回前解壓數據。你能夠經過調用rawResponseData獲得原始壓縮數據。

聯機解壓gzip響應包
默認的,ASIHTTPRequest會一直等到請求完成對gzip響應包的解壓縮。設置 shouldWaitToInflateCompressedResponses屬性爲no,你能夠告訴ASIHTTPRequest在收到數據同時進行 解壓。有時候,這會提高一點速度,由於當一個請求等待更多響應時,數據能夠同時被處理。
這個特性對於須要使用流解析器(streaming parser)如xml或json解析器時尤爲有用,打開這個選項,你能夠直接給你的解析器輸送解壓過的數據,他們來自你委託實現的request:didReceiveData: 方法。

注意當shouldWaitToInflateCompressedResponses爲no時,原始(壓縮過的)數據將被丟棄,參看ASIHTTPRequest.h的註釋得到更多信息。


使用gzip來壓縮請求body
v1.0.3新增了請求body的gzip壓縮。使用這個特性,你的應用能夠壓縮post/put操做的內容,只要設置shouldCompressRequestBody爲yes便可。shouldCompressRequestBody默認爲no。

當你配置了SetInputFilter DEFLATE 後,apatche的mod_deflate能夠自動的解壓gzip請求體。這個方法爲cgi內容工做,可是若是你使用apatche模塊構建成了一個 RESOURCE過濾器(如mod PHP)則不能工做,這時你須要本身搞定數據解壓。

注意:ASIHTTPRequest不能檢查到服務器是否接受gzip請求體。只有當你肯定服務器能搞定gzip body時使用這項特性。
避免對壓縮格式文件如jpeg/png/gif/pdf/swf使用gzip,你會發現gzip版本會比原始文件大。

2四、
恢復被打斷的下載
自v0.94開始,ASIHTTPRequest可以恢復不完整的下載
- (IBAction)resumeInterruptedDownload:(id)sender
{
  NSURL *url = [NSURL URLWithString:
    @"http://allseeing-i.com/ASIHTTPRequest/Tests/the_great_american_novel.txt"];
  ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
 
  NSString *downloadPath = @"/Users/ben/Desktop/my_work_in_progress.txt";
 
  // The full file will be moved here if and when the request completes successfully
  [request setDownloadDestinationPath:downloadPath];
 
  // This file has part of the download in it already
  [request setTemporaryFileDownloadPath:@"/Users/ben/Desktop/my_work_in_progress.txt.download"];
  [request setAllowResumeForFileDownloads:YES];
  [request startSynchronous];
 
  //The whole file should be here now.
  NSString *theContent = [NSString stringWithContentsOfFile:downloadPath];
}



這隻在下載數據到文件時有用,你必須設置allowResumeForFileDownloads爲yes,爲了:
任何你未來可能想恢復的下載(或者ASIHTTPRequest會在取消或釋放時刪除的臨時下載)
任何你想恢復的下載

並且,你必須設置一個臨時下載路徑(setTemporaryFileDownloadPath),用不完整數據的路徑,新數據將被追加到這個文件,當下載成功,這個文件會被移到downloadDestinationPath。

ASIHTTPRequest不會檢查accept-range頭(由於額外head請求的負擔),因此僅在肯定服務器可以支持不完整下載時才使用此特徵。

2五、 直接從磁盤流式請求body

自v0.96開始,ASIHTTPRequest可以使用磁盤文件做爲請求body。這意味着將請求body保持在內存再也不必要,這樣一來,大型的post/put操做的將極大的減小內存使用量。

你能夠以幾種方法來使用這一特徵:
ASIFormDataRequests
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com/ignore"];
 
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:@"foo" forKey:@"post_var"];
[request setFile:@"/Users/ben/Desktop/bigfile.txt" forKey:@"file"];
[request startSynchronous];


ASIFormDataRequests在你使用setFile:forKey:,自動使用這一特性。請求將建立臨時文件,包含完整的請求body。文件 一次寫入一些body的相關部分。請求被CFReadStreamCreateForStreamedHTTPRequest建立,使用此文件上的讀取流 做爲來源。

常規的ASIHTTPRequest
若是你知道你的請求將會很大,能夠在請求上打開磁盤流(streaming from disk):
[request setShouldStreamPostDataFromDisk:YES];

在下面的例子中,咱們每次添加一個NSData對象。有兩個方法作這個事 - 從內存添加數據(appendPostData:),或者使用appendPostDataFromFile從文件添加內容。

NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com/ignore"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setShouldStreamPostDataFromDisk:YES];
[request appendPostData:myBigNSData];
[request appendPostDataFromFile:@"/Users/ben/Desktop/bigfile.txt"];
[request startSynchronous];


在本例中,咱們想要直接put一個大文件。咱們本身設置setPostBodyFilePath,ASIHTTPRequest將使用這個文件做爲post body。
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com/ignore"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setRequestMethod:@"PUT"];
[request setPostBodyFilePath:@"/Users/ben/Desktop/another-big-one.txt"];
[request setShouldStreamPostDataFromDisk:YES];
[request startSynchronous];


很是重要:你不該該在上面任何方法的同一個請求中使用setPostBody - 他們是互斥的,setPostBody只能用於你本身構建請求body,並計劃將請求body保留到內存的情型。

2六、
使用下載緩存
ASIDownloadCache 以及 ASICacheDelegate 的API在v1.8中已經改變,若是從v1.7升級的話,你須要更新你的代碼。
特別是,緩存策略的可用選項是不一樣的,而且你如今能夠將多個緩存策略合併到單個請求中。

ASIHTTPRequest能夠自動保存下載數據到一個緩存,以便之後使用。許多狀況下這會頗有幫助:
你想要訪問數據,在沒有因特網鏈接不能從新下載時;
你想下載些東西,僅在你上次下載後它有了變化時;
你用的內容永不改變,因此你只想下載它一次;

在以前的ASIHTTPRequest版本中,處理以上狀況意味着你本身手動保存這些數據。使用一個下載緩存能夠在一些狀況下減小你本身編寫本地存儲機制的需求。

ASIDownloadCache是一個簡單的url緩存,能夠被用於緩存get請求的響應。爲了符合響應緩存的條件,請求必須成功(沒有錯誤),服務器 必須返回一個200 ok的http響應碼,或者從v1.8.1開始,支持301,302,303,307重定向的狀態碼。

開啓響應緩存很簡單:
[ASIHTTPRequest setDefaultCache:[ASIDownloadCache sharedCache]];

開啓以後,全部的請求會自動使用緩存。若是你喜歡,你能夠爲獨立的請求設置共享緩存:
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setDownloadCache:[ASIDownloadCache sharedCache]];


緩存不限於單個,你能夠建立任意多個緩存。當你本身建立緩存時,必須設置緩存的存儲路徑 -這應該是一個可寫的文件夾:
ASIDownloadCache *cache = [[[ASIDownloadCache alloc] init] autorelease];
[cache setStoragePath:@"/Users/ben/Documents/Cached-Downloads"];

// Don't forget - you are responsible for retaining your cache!
 
[self setMyCache:cache];

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
 
[request setDownloadCache:[self myCache]];

2七、關於緩存策略
緩存策略是在信息存儲於緩存中時你主要的控制方法,以及什麼時候優先使用緩存的數據,而不是從新下載數據。

獨立請求的緩存策略可使用它的cachePolicy屬性。緩存策略使用位掩碼(bitmask)定義,因此你能夠組合多個選項來建立想要的策略:
// Always ask the server if there is new content available, 
// If the request fails, use data from the cache even if it should have expired.
[request setCachePolicy:ASIAskServerIfModifiedCachePolicy|ASIFallbackToCacheIfLoadFailsCachePolicy];

你可使用下列選項來定義一個請求的緩存策略:

ASIUseDefaultCachePolicy
默認緩存策略,當你對請求應用此策略時,它會使用緩存的defaultCachePolicy,ASIDownloadCache的默認緩存策略是 ASIAskServerIfModifiedWhenStaleCachePolicy,你不該該將此策略和其餘策略組合使用。

ASIDoNotReadFromCacheCachePolicy
請求不會從緩存讀取數據

ASIDoNotWriteToCacheCachePolicy
請求不會保存到緩存

ASIAskServerIfModifiedWhenStaleCachePolicy
這是ASIDownloadCaches的默認緩存策略。使用了它,請求會首先查看緩存中是否有可用的緩存響應數據。若是沒有,請求會照常進行。
若是有沒有過時的緩存數據,請求會使用它而不去訪問服務器。若是緩存數據過時了,請求將執行一個有條件的get去獲取是否有可用的升級版本。若是服務器表 示緩存的數據就是最新的,那麼緩存的數據將被使用,新的數據不會被下載。這時,緩存的過時時間(expiry date)將根據服務器新的過時時間而被更新。若是服務器提供了更新內容,則將被下載,新的數據和過時時間將被寫入緩存。

ASIAskServerIfModifiedCachePolicy
這個策略和ASIAskServerIfModifiedWhenStaleCachePolicy相同,只是請求每次都會詢問服務器是否有新的數據

ASIOnlyLoadIfNotCachedCachePolicy
只要存在緩存數據,老是會被使用,即便它已通過期。

ASIDontLoadCachePolicy
請求僅在響應已經被緩存時成功。若是請求沒有任何響應被緩存,請求會終止,而且也不會爲此請求設置錯誤。

ASIFallbackToCacheIfLoadFailsCachePolicy
若是請求失敗,將會退回到緩存數據。若是失敗後使用了緩存的數據,請求將會成功而不報錯。你通常會將它和其餘策略混合使用,由於此策略僅在發生問題時用於指定行爲。


當你爲緩存設置了defaultCachePolicy屬性,全部的請求將會使用這個緩存策略,除非他們本身設置了自定義的策略。

2八、
關於存儲策略
存儲策略容許你定義特定響應的緩存將被保存多久,ASIHTTPRequest目前支持兩種存儲策略:
ASICacheForSessionDurationCacheStoragePolicy 是默認值。響應僅在會話期間被保存,並將在緩存首次使用後被刪除,或者當調用[ASIHTTPRequest clearSession] 時被刪除。
使用ASICachePermanentlyCacheStoragePolicy,緩存數據將被永久保存,要用這個存儲策略,可將它設置到一個請求上:

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];


要手動清除緩存,調用clearCachedResponsesForStoragePolicy,傳入你但願清除的緩存數據的存儲類型:
[[ASIDownloadCache sharedCache] clearCachedResponsesForStoragePolicy:ASICachePermanentlyCacheStoragePolicy];

2九、
其餘緩存特性
// 當你關掉shouldRespectCacheControlHeaders, 響應數據將被保存,即便服務器明確要求不要緩存他們
// (eg with a cache-control or pragma: no-cache header)
[[ASIDownloadCache sharedCache] setShouldRespectCacheControlHeaders:NO];

爲請求設置secondsToCache,覆蓋了由服務器設置的任何過時時間,一直保存響應數據直到secondsToCache秒到期。
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setSecondsToCache:60*60*24*30]; // Cache for 30 days


在請求運行後,didUseCachedResponse將在響應由緩存返回時,返回yes
[request didUseCachedResponse];

詢問緩存請求數據的保存路徑,這是使用下載緩存最高效的方式,由於數據沒必要在請求完成後被拷貝到緩存
[request setDownloadDestinationPath:
   [[ASIDownloadCache sharedCache] pathToStoreCachedResponseDataForRequest:request]];

寫你本身的緩存
若是你已經有一個下載緩存,並想將它接入到ASIHTTPRequest,或者你想要寫本身的緩存,可讓你的緩存實現ASICacheDelegate協議。

30、
節約帶寬
從v1.0.7開始,ASIHTTPRequest可以限制全部請求使用的帶寬,防止它超過一個用戶定義的上限。這能夠幫助收發大量數據的iphone應用經過app store的審覈程序。

限流工做使用一個全侷限制(以字節爲單位),來限定每秒可以收發的數據總量。全部的請求共享這個限制。當他們收發數據時,ASIHTTPRequest追蹤上一秒內有多少數據被收發。若是某個請求超過了限制,任何其餘的執行單位也都必須等待本次測量時段結束。

在ios上,你可讓ASIHTTPRequest自動打開限流,當你使用一個wwan(gprs/edge/3g)鏈接時,而當切換到wifi時,會自動關閉他。

當使用wwan激活時將限制帶寬到爲移動應用預約義的默認值,wifi請求不受影響,此方法僅限於ios
// Will limit bandwidth to the predefined default for mobile applications when WWAN is active.
// Wi-Fi requests are not affected
// This method is only available on iOS
[ASIHTTPRequest setShouldThrottleBandwidthForWWAN:YES];


當wwan激活後,限制帶寬爲用戶定義的值,僅限ios
// Will throttle bandwidth based on a user-defined limit when when WWAN (not Wi-Fi) is active
// This method is only available on iOS
[ASIHTTPRequest throttleBandwidthForWWANUsingLimit:14800];


限制全部請求,無論是否是wifi,都會限制到預約義的值--當心使用
// Will prevent requests from using more than the predefined limit for mobile applications.
// Will limit ALL requests, regardless of whether Wi-Fi is in use or not - USE WITH CAUTION
[ASIHTTPRequest setMaxBandwidthPerSecond:ASIWWANBandwidthThrottleAmount];


記錄每秒多少字節的數據被收發(從前5秒取平均值)
// Log how many bytes have been received or sent per second (average from the last 5 seconds)
NSLog(@"%qi",[ASIHTTPRequest averageBandwidthUsedPerSecond]);

很是重要:啓用帶寬限制以前先讀讀這個:
帶寬限制應被視爲一個實驗性特徵,使用時自行承擔風險
不要將帶寬限制過底,最好不要低於ASIWWANBandwidthThrottleAmount
你的應用實際使用的帶寬將老是稍稍大於你設置的值,由於帶寬測量不包括http頭使用的帶寬
ASIWWANBandwidthThrottleAmount不是官方的值,據我所知,官方沒有發佈帶寬限制值
你不該該在你的應用並無大量數據傳輸時打開帶寬限制,僅在有大量數據上傳或下載的請求執行時啓用它,其餘時間請關閉。

3一、客戶端證書支持
若是你的服務器須要使用客戶端證書,v1.8之後能夠經過請求來發送他們。
// Will send the certificate attached to the identity (identity is a SecIdentityRef)
[request setClientCertificateIdentity:identity];

// Add an additional certificate (where cert is a SecCertificateRef)
[request setClientCertificates:[NSArray arrayWithObject:(id)cert]];

在iphone/ipad app的ClientCertificateTests.m中有一個幫助函數,能夠從pkcs12數據建立一個SecIdentityRef(此函數僅在ios中有用)。

3二、同代理一塊兒工做
ASIHTTPRequest能夠檢測到系統代理而且自動將他們應用到請求。從v1.0.6開始,他也支持pac文件代理配置,以及驗證代理。
默認的,ASIHTTPRequest將嘗試自動檢測代理設置,可是,你可能但願可以手動設置代理:
// Configure a proxy server manually
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com/ignore"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setProxyHost:@"192.168.0.1"];
[request setProxyPort:3128];

// Alternatively, you can use a manually-specified Proxy Auto Config file (PAC)
 
// (It's probably best if you use a local file)
[request setPACurl:[NSURL URLWithString:@"file:///Users/ben/Desktop/test.pac"]];



驗證代理
在mac os上,ASIHTTPRequest能夠自動檢測用於驗證代理的證書,若是他們在系統參數中指定了的話。在ios上,則不能自動檢測,因此你要麼手動設 置他們,使用委託來詢問控制器/相應證書的用戶,要麼讓ASIAuthenticationDialog詢問用戶。一旦有效的代理證書被接受,他們將被保 存到鍵鏈中(當useKeychainPersistence被打開)並自動被重用。


手動指定代理的證書
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com/ignore"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request setProxyHost:@"192.168.0.1"];
[request setProxyPort:3128];

// Set a username and password for authenticating proxies
 
[request setProxyUsername:@"bencopsey"];
[request setProxyPassword:@"password"];

// For NTLM proxies, you can also set the domain (NTLM proxies are untested!)
 
[request setProxyDomain:@"la.la.land"];


使用委託來詢問代理證書
這和使用委託提供常規驗證證書的方式同樣,除了委託必須響應proxyAuthenticationNeededForRequest(之前的名字是proxyAuthorizationNeededForRequest)。

使用內置驗證對話框(目前僅ios)
v1.0.8以後新增了ASIAuthenticationDialog類。這個類可被用於詢問用戶web服務器或代理的驗證證書。

若是你的委託不能響應proxyAuthenticationNeededForRequest,默認的,ASIHTTPRequest將顯示一個提示用 戶提供證書的對話框。它默認爲代理服務器顯示,這樣全部使用ASIHTTPRequest的應用能夠同驗證代理工做,而不須要任何開發者端額外的努力。

同步請求時,代理驗證對話框不會顯示。
若是你不喜歡用代理驗證對話框,要麼你在你的代理中實現proxyAuthenticationNeededForRequest,或者將 shouldPresentProxyAuthenticationDialog設置爲false(那樣你的應用將不能鏈接到驗證代理)。若是你想改變它 的外觀,子類化ASIHTTPRequest並覆蓋showProxyAuthenticationDialog來顯示你的自定義對話框,或者子類化 ASIAuthenticationDialog。

3三、其餘特性
自定義用戶代理
設置你的應用將使用的用戶代理:
[ASIHTTPRequest setDefaultUserAgentString:@"MyApp 1.0"]

若是你不設置用戶代理,ASIHTTPRequest會爲你建立一個,例如(對於mac os 程序):
My Application 1.0 (Macintosh; Mac OS X 10.5.7; en_GB)

你也能夠爲每一個請求設置用戶代理:
[request setUserAgent:@"MyApp 1.0"]

在ios中程序進入後臺時繼續請求
// iOS 4+ only
[request setShouldContinueWhenAppEntersBackground:YES];

監視網絡活動
// Log the average bandwidth used (in bytes) per second over the last 5 seconds
NSLog(@"%llu",[ASIHTTPRequest averageBandwidthUsedPerSecond]);

if ([ASIHTTPRequest isNetworkInUse]) {
 
        // ASIHTTPRequest has requests in progress that are using the network
}


禁用自動更新網絡活動指示器(僅ios)
默認的,ASIHTTPRequest會顯示網絡活動指示器(在狀態條上),當你的請求使用網絡時。若是你想要本身管理這個,你能夠禁用這些更新:
[ASIHTTPRequest setShouldUpdateNetworkActivityIndicator:NO];

當請求超時自動重試
請求超時,最多重試2次:
[request setNumberOfTimesToRetryOnTimeout:2];

配置持續鏈接(persistent connection)
默認的,ASIHTTPRequest將嘗試保持到服務器的鏈接,這樣他們能夠被連到相同服務器的請求重用(這通常致使速度顯著提高,特別是你有許多小的請求時)。
當鏈接到http1.1服務器時,持續鏈接將自動啓用,或者當服務器發回一個keep-alive頭時。當服務器明確的發回一個Connection: close頭時,持續鏈接將被關閉。另外,ASIHTTPRequest對於包含body的請求(如post/put),將不會使用持續鏈接。你能夠強制 這些請求使用持續鏈接,手動設置請求方法,而後將持續鏈接從新打開:
[request setRequestMethod:@"PUT"];
[request setShouldAttemptPersistentConnection:YES];


許多服務器不在響應頭中提供鏈接保持多久的信息,因此可能在請求完成後的任什麼時候間關閉鏈接。若是服務器不發送任何此類信息,ASIHTTPRequest將在請求完成後60秒內保持鏈接。有賴於你的服務器配置,這個時間可能過長或太短。

若是這個超時過長,服務器將在下一個請求有機會用它前踢掉你,若是ASIHTTPRequest碰到關閉鏈接的錯誤,它將在一個新鏈接上重試這個請求。

若是這個超時太短,服務器可能很樂意保持這個鏈接更久,可是ASIHTTPRequest將沒必要要的重開一個新鏈接,這會招致效率上的懲罰。

// Set the amount of time to hang on to a persistent connection before it should expire to 2 minutes
[request setPersistentConnectionTimeoutSeconds:120];
// Disable persistent connections entirely
[request setShouldAttemptPersistentConnection:NO];


強制使用http 1.0
[request setUseHTTPVersionOne:YES];

禁用安全證書驗證
你可能但願使用這個測試你有一個自簽名的安全證書。我推薦從一個可信的證書機構購買證書,而且只爲產品程序打開證書驗證。
[request setValidatesSecureCertificate:NO];

3四、
調試選項 ASIHTTPRequest提供了一些有助於調試請求行爲的標誌。這些標誌能夠在ASITHHPRequestConfig.h中找到。 當你打開這些標誌後,請求會把他們乾的事打印到控制檯。 DEBUG_REQUEST_STATUS 打印整體請求的生命週期信息 -- 開始,結束上傳,結束下載 等等。 DEBUG_THROTTLING 打印(粗略的)有多少帶寬被使用的信息,若是請求被限流,還包括這如何發生的信息。同DEBUG_REQUEST_STATUS聯合使用,可能對調試超時有幫助,由於你能夠看到在哪一點請求中止了收發數據。 DEBUG_PERSISTENT_CONNECTIONS 打印請求如何重用持續鏈接的信息,若是你看到輸出下面的信息: Request attempted to use connection #1, but it has been closed - will retry with a new connection …這表示你設置到persistentConnectionTimeoutSeconds的值可能太高,參看「配置持續鏈接」小節得到更多信息。 DEBUG_HTTP_AUTHENTICATION 從v1.8.1後添加,這會打印出關於請求如何處理http驗證(基本/摘要/ntml)的信息。 DEBUG_FORM_DATA_REQUEST 打印ASIFormDataRequest將發送的請求body的概要。僅在使用ASIFormDataRequest有用。
相關文章
相關標籤/搜索