小嘗ASIHTTPReques

一、什么是ASIHTTPRequest

使用iOS SDK中的HTTP網絡請求API,相當的復雜,調用很繁瑣,ASIHTTPRequest就是一個對CFNetwork API進行了封裝,并且使用起來非常簡單的一套API,用Objective-C編寫,可以很好的應用在Mac OS X系統和iOS平臺的應用程序中。ASIHTTPRequest適用于基本的HTTP請求,和基于REST的服務之間的交互。

二、ASIHTTPRequest功能

○l 通過簡單的接口,即可完成向服務端提交數據和從服務端獲取數據的工作

○l 下載的數據,可存儲到內存中或直接存儲到磁盤中

○l 能上傳本地文件到服務端

○l 可以方便的訪問和操作請求和返回的Http頭信息

○l 可以獲取到上傳或下載的進度信息,為應用程序提供更好的體驗

○l 支持上傳或下載隊列,并且可獲取隊列的進度信息

○l 支持基本、摘要和NTLM身份認證,在同一會話中授權憑證會自動維持,并且可以存儲在Keychain(Mac和iOS操作系統的密碼管理系統)中

○l 支持Cookie

○l 當應用(iOS 4+)在后臺運行時,請求可以繼續運行

○l 支持GZIP壓縮數據

○l 內置的ASIDownloadCache類,可以緩存請求返回的數據,這樣即使沒有網絡也可以返回已經緩存的數據結果

○l ASIWebPageRequest –可以下載完整的網頁,包括包含的網頁、樣式表、腳本等資源文件,并顯示在UIWebView /WebView中。任意大小的頁面都可以無限期緩存,這樣即使沒有網絡也可以離線瀏覽

○l 支持客戶端證書

○l 支持通過代理發起Http請求

○l 支持帶寬限制。在iOS平臺,可以根據當前網絡情況來自動決定是否限制帶寬,例如當使用WWAN(GPRS/Edge/3G)網絡時限制,而當使用WIFI時不做任何限制

○l 支持斷點續傳

○l 支持同步和異步請求

三、ASIHTTPRequest使用

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的子類。也就是說它可以直接被放到"任務隊列"中,并被執行。上面的代碼隊了隊列的創建與添加操作外,其它代碼與上一例一樣。

請求隊列上下文

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 ]。

默認情況下,隊列中的一個請求如果失敗,它會取消所有未完成的請求??梢栽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 ];

就可以了。

ASIHTTPRequest會自動保存訪問過的URL信息,并備之后用。在以下幾個場景非常有用:

1,當沒有網絡連接的時候。

2,已下載的數據再次請求時,僅當它與本地版本不樣時才進行下載。

ASIDownloadCache 設置下載緩存

它對Get請求的響應數據進行緩存(被緩存的數據必需是成功的200請求):

[ASIHTTPRequest setDefaultCache:[ASIDownloadCache sharedCache]];

當設置緩存策略后,所有的請求都被自動的緩存起來。

另外,如果僅僅希望某次請求使用緩存操作,也可以這樣使用:

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

[request setDownloadCache:[ASIDownloadCache sharedCache]];

多種的緩存并存

僅僅需要創建不同的ASIDownloadCache,并設置緩存所使用的路徑,并設置到需要使用的request實例中:

ASIDownloadCache *cache = [[[ASIDownloadCache alloc] init] autorelease];

[cache setStoragePath:@"/Users/ben/Documents/Cached-Downloads"];

[self setMyCache:cache];

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

[request setDownloadCache:[self myCache]];

緩存策略

緩存策略是我們控制緩存行為的主要方式,如:什么時候進行緩存,緩存數據的利用方式。

以下是策略可選列表(可組合使用):

○ASIUseDefaultCachePolicy 這是一個默認的緩存策略“ASIAskServerIfModifiedWhenStaleCachePolicy”,這個很明白,見名知意(它不能與其它策略組合使用)

○ASIDoNotReadFromCacheCachePolicy 所讀數據不使用緩存

○ASIDoNotWriteToCacheCachePolicy 不對緩存數據進行寫操作

○ASIAskServerIfModifiedWhenStaleCachePolicy 默認緩存行為,request會先判斷是否存在緩存數據。a, 如果沒有再進行網絡請求。 b,如果存在緩存數據,并且數據沒有過期,則使用緩存。c,如果存在緩存數據,但已經過期,request會先進行網絡請求,判斷服務器版本與本地版本是否一樣,如果一樣,則使用緩存。如果服務器有新版本,會進行網絡請求,并更新本地緩存

○ASIAskServerIfModifiedCachePolicy 與默認緩存大致一樣,區別僅是每次請求都會 去服務器判斷是否有更新

○ASIOnlyLoadIfNotCachedCachePolicy 如果有緩存在本地,不管其過期與否,總會拿來使用

○ASIDontLoadCachePolicy 僅當有緩存的時候才會被正確執行,如果沒有緩存,request將被取消(沒有錯誤信息)

○ASIFallbackToCacheIfLoadFailsCachePolicy 這個選項經常被用來與其它選項組合使用。請求失敗時,如果有緩存當網絡則返回本地緩存信息(這個在處理異常時非常有用)

如果設置了“defaultCachePolicy”則所有的請求都會使用此緩存。

緩存存儲方式

你可以設置緩存的數據需要保存多長時間,ASIHTTPRequest提供了兩種策略:

a,ASICacheForSessionDurationCacheStoragePolicy,默認策略,基于session的緩存數據存儲。當下次運行或[ASIHTTPRequest clearSession]時,緩存將失效。

b,ASICachePermanentlyCacheStoragePolicy,把緩存數據永久保存在本地,

如:

ASIHTTPRequest *request = [ ASIHTTPRequest requestWithURL:url ];

[ request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy ];

另外,也可以使用clearCachedResponsesForStoragePolicy來清空指定策略下的緩存數據。

緩存其它特性

設置是否按服務器在Header里指定的是否可被緩存或過期策略進行緩存:

[[ ASIDownloadCache sharedCache ] setShouldRespectCacheControlHeaders:NO ];

設置request緩存的有效時間:

[ request setSecondsToCache:60*60*24*30 ]; // 緩存30天

可以判斷數據是否從緩存讀取:

[ request didUseCachedResponse ];

設置緩存所使用的路徑:

[ request setDownloadDestinationPath:[[ ASIDownloadCache sharedCache ] pathToStoreCachedResponseDataForRequest:request ]];

實現自定義的緩存

只要簡單的實現ASICacheDelegate接口就可以被用來使用。

使用代理請求

默認的情況下,ASIHTTPRequest會使用被設置的默認代理。但你也可以手動修改http代理:

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

ASIHTTPRequest, 請求的其它特性

iOS4中,當應用后臺運行時仍然請求數據:

[ request setShouldContinueWhenAppEntersBackground:YES ];

是否有網絡請求:

[ ASIHTTPRequest isNetworkInUse ]

是否顯示網絡請求信息在status bar上:

[ ASIHTTPRequest setShouldUpdateNetworkActivityIndicator:NO ];

設置請求超時時,設置重試的次數:

[ request setNumberOfTimesToRetryOnTimeout:2 ];

KeepAlive的支持:

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

ASIHTTPRequest 一款強大的HTTP包裝開源項目

ASIHTTPRequest,是一個直接在CFNetwork上做的開源項目,提供了一個比官方更方便更強大的HTTP網絡傳輸的封裝。

特色功能如下:

1,下載的數據直接保存到內存或文件系統里

2,提供直接提交(HTTP POST)文件的API

3,可以直接訪問與修改HTTP請求與響應HEADER

4,輕松獲取上傳與下載的進度信息

5,異步請求與隊列,自動管理上傳與下載隊列管理機

6,認證與授權的支持

7,Cookie

8,請求與響應的GZIP

9,代理請求

下面來兩個小例子:

NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

[request start];

NSError *error = [request error];

if (!error) {

NSString *response = [request responseString];

}

當你需要添加更多的請求信息時,如,添加個請求Header:

[request addRequestHeader:@"name" value:@"Jory lee"];

添加Post請求時的健值:

[request setPostValue:@"Ben" forKey:@"first_name"];

[request setPostValue:@"Copsey" forKey:@"last_name"];

[request setFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photo"];

設置HTTP的授權帳號:

[request setUsername:@"username"];

[request setPassword:@"password"];

一個異步請求:

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

}

在我們數據獲取的過程中,如果數據源復雜,一個請求隊列是必不可少的:

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

}

ASIHTTPRequest -Main classes介紹:

1.ASIHTTPRequest:處理與服務器的基本交互,包括下載上傳,認證,cookies以及進度查看。

2.ASIFormDataRequest:是ASIHTTPRequest子類,主要處理post事件,它能使post更加簡單。

3.ASINetworkQueue:是NSOperationQueue子類,當處理多個請求時可以使用,如果每次都是單個請求就不必使用。

4.ASIDownloadCache:該類允許ASIHTTPRequest從服務器傳遞cookie。

ASIHTTPRequest -Support classes介紹:

1.ASIInputStream:當使用ASIHTTPRequest上傳數據時使用,如果工程中用了ASIHTTPRequest,就一定要include這個類。

2.ASIAuthenticationDialog:該類允許ASIHTTPRequest連接到服務器時呈現登錄框。在所有iPhone OS工程中都要使用,Mac OS工程中可以不用。

3.Reachability:相信很多人對這個類已經很熟悉了,當在你程序中偵測網絡狀態時它將非常有用。

ASIHTTPRequest -Protocols and configuration介紹:

1.ASIHTTPRequestDelegate:該協議指定了ASIHTTPRequest的delegate可能需要實現的方法,所有方法都是optional。

2.ASIProgressDelegate:該協議列出了uploadProgressDelegate和downloadProgressDelegate可能需要實現的方法,所有方法為optional。

3.ASICacheDelegate:該協議指定了download cache必須實現的方法。如果你要寫你自己的download cache,確保實現required方法。

4.ASIHTTPRequestConfig.h:該文件定義了編譯時所有的全局配置選項。使用該文件中的方法可以在控制臺中輸出request正在進行的任務.

使用ASIHTTPRequest獲取文本HTTP響應

如果要在ios中實現類似最簡單的HttpClient應用的功能,可以直接用Cocoa的CFNetwork framework,但是,因為它是將C語言編寫的BSD網絡庫做的封裝,因此使用起來很繁瑣。

ASIHTTPRequest是第三方HTTP編程的ObjC庫?;贑FNetwork framework。網址在這里:

http://allseeing-i.com/ASIHTTPRequest

要使用該庫,首先是下載部署。下載zip包解壓縮即可。部署可見官方文檔:

http://allseeing-i.com/ASIHTTPRequest/Setup-instructions

這里也說一下,首先該庫還依賴其他框架和庫:

一般來說,是增加畫紅線的幾個框架。

然后,需要把解壓縮包里的Classes目錄下全部文件加到項目的Classes下。這里要注意:

這幾個目錄除外。除非你確實用到它。

另外,還需要加入External/Reachability目錄下的文件。

代碼寫起來很簡單:

-(void) doSimpleGetText{

NSURL *url = [NSURL URLWithString:@"

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,698評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,202評論 3 426
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,742評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,580評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,297評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,688評論 1 327
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,693評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,875評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,438評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,183評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,384評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,931評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,612評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,022評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,297評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,093評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,330評論 2 377

推薦閱讀更多精彩內容

  • AFHTTPRequestOperationManager 網絡傳輸協議UDP、TCP、Http、Socket、X...
    Carden閱讀 4,371評論 0 12
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,816評論 18 139
  • 218.241.181.202 wxhl60 123456 192.168.10.253 wxhl66 wxhl6...
    CYC666閱讀 1,414評論 0 6
  • iOS開發系列--網絡開發 概覽 大部分應用程序都或多或少會牽扯到網絡開發,例如說新浪微博、微信等,這些應用本身可...
    lichengjin閱讀 3,702評論 2 7
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,373評論 0 35