發送資料
本文為大家介紹了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。