日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ASIHTTPRequest 详解, http 请求终结者

發布時間:2023/12/19 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASIHTTPRequest 详解, http 请求终结者 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉:http://www.cnblogs.com/chen1987lei/archive/2011/06/07/2074636.html

ASIHTTPRequest是一款極其強勁的HTTP訪問開源項目。讓簡單的API完成復雜的功能,

如:
異步請求,隊列請求,GZIP壓縮,緩存,斷點續傳,進度跟蹤,上傳文件,HTTP認證
在新的版本中,還加入了Objective-C閉包Block的支持,讓我們的代碼更加輕簡靈活。

下面就舉例說明它的API用法。

發起一個同步請求
同步意為著線程阻塞,在主線程中使用此方法會使應用Hang住而不響應任何用戶事件。所以,在應用程序設計時,大多被用在專門的子線程增加用戶體驗,或用異步請求代替(下面會講到)。

復制代碼
  • - (IBAction)grabURL:(id)sender
  • {
  • ? NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
  • ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
  • ? [request startSynchronous];
  • ? NSError *error = [request error];
  • ? if (!error) {
  • ??? NSString *response = [request responseString];
  • ? }
  • }

  • a, 用requestWithURL快捷方法獲取ASIHTTPRequest的一個實例
    b, startSynchronous 方法啟動同步訪問,
    c, 由于是同步請求,沒有基于事件的回調方法,所以從request的error屬性獲取錯誤信息。
    d, responseString,為請求的返回NSString信息。

    創建一個異步請求
    異步請求的好處是不阻塞當前線程,但相對于同步請求略為復雜,至少要添加兩個回調方法來獲取異步事件。
    下面異步請求代碼完成上面同樣的一件事情:

    復制代碼
  • - (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];
  • }


  • a,與上面不同的地方是指定了一個 "delegate",并用startAsynchronous來啟動網絡請求。
    b,在這里實現了兩個delegate的方法,當數據請求成功時會調用requestFinished,請求失敗時(如網絡問題或服務器內部錯誤)會調用requestFailed。


    隊列請求
    提供了一個對異步請求更加精準豐富的控制。
    如,可以設置在隊列中,同步請求的連接數。往隊列里添加的請求實例數大于maxConcurrentOperationCount時,請求實例將被置為等待,直到前面至少有一個請求完成并出列才被放到隊列里執行。
    也適用于當我們有多個請求需求按順序執行的時候(可能是業務上的需要,也可能是軟件上的調優),僅僅需要把maxConcurrentOperationCount設為“1”。

    復制代碼
  • - (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];
  • }


  • 創建NSOperationQueue,這個Cocoa架構的執行任務(NSOperation)的任務隊列。我們通過ASIHTTPRequest.h的源碼可以看到,此類本身就是一個NSOperation的子類。也就是說它可以直接被放到"任務隊列"中,并被執行。上面的代碼隊了隊列的創建與添加操作外,其它代碼與上一例一樣。

    隊列異步請求中中獲取或識別不同request小技巧
    a,可以設置一個上下文(userInfo)到request對象中,當請求響應完后可以通過訪問request對象的userInfo獲取里面的信息
    b,為每一個請求實例設置不同的setDidFinishSelector / setDidFailSelector的回調方法
    c,子類化ASIHTTPRequest,重寫requestFinished: 與 failWithProblem:方法

    ASINetworkQueues, 它的delegate提供更為豐富的功能
    提供的更多的回調方法如下:
    a,requestDidStartSelector,請求發起時會調此方法,你可以在此方法中跟據業務選擇性的設置request對象的deleaget。
    b,requestDidReceiveResponseHeadersSelector,當接受完響應的Header后設計此方法,這個對下載大數據的時候相當有用,你可以在方法里做更多業務上的處理。
    c,requestDidFinishSelector,請求并響應成功完成時調用此方法
    d,requestDidFailSelector,請求失敗
    e,queueDidFinishSelector,整個隊列里的所有請求都結束時調用此方法。
    ??
    它是NSOperationQueues的擴展,小而強大。但也與它的父類略有區別。如,僅添加到隊列中其實并不能執行請求,只有調用[? queue g o ]才會執行;一個正在運行中的隊列,并不需要重復調用[? queue go? ]。

    引用 text\">
    默認情況下,隊列中的一個請求如果失敗,它會取消所有未完成的請求??梢栽O置[? queue setShouldCancelAllRequestsOnFailure:NO? ]來修 正。




    取消異步請求
    首先,同步請求是不能取消的。
    其次,不管是隊列請求,還是簡單的異步請求,全部調用[ request cancel ]來取消請求。


    引用 取消的請求默認都會按請求失敗處理,并調用請求失敗delegate。
    如果不想調用delegate方法,則設置:[ request clearDelegatesAndCancel];



    隊列請求中需要注意的是,如果你取消了一個請求,隊列會自動取消其它所有請求。
    如果只想取消一個請求,可以設置隊列:[ queue setShouldCancelAllRequestsOnFailure:NO ];
    如果想明確取消所有請求:[ queue cancelAllOperations ];

    安全的內存回收建議
    request并沒有retain你的delegate,所以在沒有請求完的時候釋放了此delegate,需要在dealloc方法里先取消所有請求,再釋放請求實例,如:

    復制代碼
  • - (void)dealloc
  • {
  • ?? [request clearDelegatesAndCancel];
  • ?? [request release];
  • ?? ...
  • ?? [super dealloc];
  • }


  • 向服務器端上傳數據
    ASIFormDataRequest ,模擬 Form表單提交,其提交格式與 Header會自動識別。
    沒有文件:application/x-www-form-urlencoded
    有文件:multipart/form-data

    復制代碼
  • 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"];
  • [request addData:imageData withFileName:@"george.jpg" andContentType:@"image/jpeg" forKey:@"photos"];


  • 如果要發送自定義數據:

    復制代碼
  • 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"];


  • 下載文件
    通過設置request的setDownloadDestinationPath,可以設置下載文件用的下載目標目錄。
    首先,下載過程文件會保存在temporaryFileDownloadPath目錄下。如果下載完成會做以下事情:
    1,如果數據是壓縮的,進行解壓,并把文件放在downloadDestinationPath目錄中,臨時文件被刪除
    2,如果下載失敗,臨時文件被直接移到downloadDestinationPath目錄,并替換同名文件。

    如果你想獲取下載中的所有數據,可以實現delegate中的request:didReceiveData:方法。但如果你實現了這個方法,request在下載完后,request并不把文件放在downloadDestinationPath中,需要手工處理。

    獲取響應信息
    信息:status , header, responseEncoding

    復制代碼
  • [request responseStatusCode];
  • [[request responseHeaders] objectForKey:@"X-Powered-By"];
  • [request responseEncoding];



  • 獲取請求進度
    有兩個回調方法可以獲取請求進度,
    1,downloadProgressDelegate,可以獲取下載進度
    2,uploadProgressDelegate,可以獲取上傳進度

    cookie的支持
    如果Cookie存在的話,會把這些信息放在NSHTTPCookieStorage容器中共享,并供下次使用。
    你可以用[ ASIHTTPRequest setSessionCookies:nil ] ; 清空所有Cookies。
    當然,你也可以取消默認的Cookie策略,而使自定義的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]);



  • 大文件斷點續傳
    0.94以后支持大文件的斷點下載,只需要設置:
    ? [ request setAllowResumeForFileDownloads:YES ];
    ? [ request setDownloadDestinationPath:downloadPath ];
    就可以了。

    版權歸旺財勇士所有~轉載需聲名~

    首發自:http://wiki.magiche.net/pages/viewpage.action?pageId=2064410

    轉載于:https://www.cnblogs.com/ygm900/p/4448006.html

    總結

    以上是生活随笔為你收集整理的ASIHTTPRequest 详解, http 请求终结者的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。