iOS開發ASIHttpRequest發送資料與下載資料

來源:互聯網
上載者:User

iOS開發ASIHttpRequest發送資料與下載資料

   發送資料

  本文為大家介紹了iOS開發ASIHttpRequest發送資料的內容,其中包括設定request頭,使用ASIFormDataRequest POST表單,PUT請求、自訂POST請求等等內容。

  設定request頭

  ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

  [request addRequestHeader:@"Referer" value:@"http://www.dreamingwish.com/"];

  使用ASIFormDataRequest POST表單

  通常資料是以’application/x-www-form-urlencoded’格式發送的,如果上傳了位元據或者檔案,那麼格式將自動變為‘multipart/form-data’ 。

  檔案中的資料是需要時才從磁碟載入,所以只要web server能處理,那麼上傳大檔案是沒有問題的。

  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"];

  資料的mime頭是自動判定的,但是如果你想自訂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"];

  你可以使用addPostValue方法來發送相同name的多個資料(夢維:服務端會以數組方式呈現):

  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"];

  PUT請求、自訂POST請求

  如果你想發送PUT請求,或者你想自訂POST請求,使用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"];

  下載資料

  本文為大家介紹了iOS開發ASIHTTPRequest下載資料的內容,其中包括設定將伺服器響應資料直接下載到檔案,處理收到的伺服器響應資料,PUT請求、擷取HTTP狀態代碼,讀取回應標頭,處理文本編碼,處理重新導向等等內容。

  將伺服器響應資料直接下載到檔案

  如果你請求的資源很大,你可以直接將資料下載到檔案中來節省記憶體。此時,ASIHTTPRequest將不會一次將返回資料全部保持在記憶體中。

  當我們把資料下載到downloadDestinationPath時,資料將首先被存在臨時檔案中。此時檔案的路徑名儲存在 temporaryFileDownloadPath中(夢維:如果不設定這個值,會自動產生一個檔案名稱,在模擬器中,檔案被建立在$TMPDIR中)。

  ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

  [request setDownloadDestinationPath:@"/Users/ben/Desktop/my_file.txt"];

  當request完成時,會發生下面兩件事之一:

  如果資料是被壓縮過(gzip)的,那麼這個壓縮過的檔案將被解壓到downloadDestinationPath,臨時檔案會被刪除。

  如果資料未被壓縮,那麼這個檔案將被移動到downloadDestinationPath,衝突解決方式是:覆蓋已存在的檔案。

  注意:如果伺服器響應資料為空白,那麼檔案是不會被建立的。如果你的返回資料可能為空白,那麼你應該先檢查下載檔案是否存在,再對檔案進行操作。

  處理收到的伺服器響應資料

  如果你想處理伺服器響應的資料(例如,你想使用流解析器對正在下載的資料流進行處理),你應該實現代理函數 request:didReceiveData:。注意如果你這麼做了,ASIHTTPRequest將不會填充responseData到記憶體,也不會將資料寫入檔案(downloadDestinationPath )——你必須自己搞定這兩件事(之一)。

  擷取HTTP狀態代碼

  ASIHTTPRequest並不對HTTP狀態代碼做任何處理(除了重新導向和授權狀態代碼,下面會介紹到),所以你必須自己檢查狀態值並正確處理。

  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頭資訊)。如果它發現了編碼資訊,它會將編碼資訊設定為合適的 NSStringEncoding.如果它沒有找到編碼資訊,它會將編碼設定為預設編碼(NSISOLatin1StringEncoding)。

  當你調用[request responseString],ASIHTTPRequest會嘗試以responseEncoding將返回的Data轉換為NSString。

  處理重新導向

  當遇到以下HTTP狀態代碼之一時,ASIHTTPRequest會自動重新導向到新的URL:

  301 Moved Permanently

  302 Found

  303 See Other

  當發生重新導向時,響應資料的值(responseHeaders,responseCookies,responseData,responseString等等)將會映射為最終地址的相應返回資料。

  當URL發生迴圈重新導向時,設定在這個URL上的cookie將被儲存到全域域中,並在適當的時候隨重新導向的請求發送到伺服器。

  Cookies set on any of the urls encountered during a redirection cycle will be stored in the global cookie store, and will be represented to the server on the redirected request when appropriate.

  你可以關閉自動重新導向:將shouldRedirect設定為NO。

  預設情況下,自動重新導向會使用GET請求(請求體為空白)。這種行為符合大多數瀏覽器的行為,但是HTTP spec規定301和302重新導向必須使用原有方法。

  要對301、302重新導向使用原方法(包含請求體),在發起請求之前,設定shouldUseRFC2616RedirectBehaviour 為YES。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.