AFN框架

  • 全稱是AFNetworking,是對NSURLSession的一層封裝
  • 雖然運行效率沒有ASI高暗膜,但是使用比ASI簡單
  • 在iOS開發(fā)中匀奏,使用比較廣泛

AFN使用技巧

1.在開發(fā)的時候可以創(chuàng)建一個工具類,繼承自我們的AFN中的請求管理者学搜,在控制器中真正發(fā)請求的代碼使用自己封裝的工具類娃善。
2.這樣做的優(yōu)點是以后如果修改了底層依賴的框架,那么我們修改這個工具類就可以了瑞佩,而不用再一個一個的去修改聚磺。
3.該工具類一般提供一個單例方法,在該方法中會設置一個基本的請求路徑炬丸。
4.該方法通常還會提供對GET或POST請求的封裝瘫寝。
5.在外面的時候通過該工具類來發(fā)送請求
6.單例方法:
+ (instancetype)shareNetworkTools
{
    static XMGNetworkTools *instance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        // 注意: BaseURL中一定要以/結尾
        instance = [[self alloc] initWithBaseURL:[NSURL URLWithString:@"http://120.25.226.186:32812/"]];
    });
    return instance;
}

AFN框架結構

AFN結構.png
1. NSURLSession
    + AFURLSessionManager
    + AFHTTPSessionManager(封裝了常用的 HTTP 方法)
        * GET
        * POST
        * UIKit + AFNetworking 分類
        * NSProgress :利用KVO

2. 半自動的序列化&反序列化的功能
    + AFURLRequestSerialization :請求的數(shù)據(jù)格式/默認是二進制的
    + AFURLResponseSerialization :響應的數(shù)據(jù)格式/默認是JSON格式
3. 附加功能
    + 安全策略
        * HTTPS
        * AFSecurityPolicy
    + 網(wǎng)絡檢測
        * 對蘋果的網(wǎng)絡連接檢測做了一個封裝
        * AFNetworkReachabilityManager

4. NSURLConnection(過期,AFN也表示不再更新)
    + AFURLConnectionOperation
    + AFHTTPRequestOperation
    + AFHTTPRequestOperationManager(封裝了常用的 HTTP 方法)
        * 屬性
            * baseURL :AFN建議開發(fā)者針對 AFHTTPRequestOperationManager 自定義個一個單例子類,設置 baseURL, 所有的網(wǎng)絡訪問焕阿,都只使用相對路徑即可
            * requestSerializer :請求數(shù)據(jù)格式/默認是二進制的 HTTP
            * responseSerializer :響應的數(shù)據(jù)格式/默認是 JSON 格式
            * operationQueue
            * reachabilityManager :網(wǎng)絡連接管理器
        * 方法
            * manager :方便創(chuàng)建管理器的類方法
            * HTTPRequestOperationWithRequest :在訪問服務器時咪啡,如果要告訴服務器一些附加信息,都需要在 Request 中設置
            * GET
            * POST

AFN發(fā)送網(wǎng)絡請求

  • 發(fā)送post請求與get請求大致相同暮屡,僅是將“2.發(fā)送請求中”方法名前部“GET”換成“POST”

(1)發(fā)送GET請求的兩種方式(POST同)

-(void)get1
{
    // 1.創(chuàng)建AFHTTPSessionManager管理者
    // AFHTTPSessionManager內(nèi)部是基于NSURLSession實現(xiàn)的
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    // 2.發(fā)送請求
    NSDictionary *param = @{
                            @"username":@"520it",
                            @"pwd":@"520it"
                            };

    // 注意:responseObject:請求成功返回的響應結果(AFN內(nèi)部已經(jīng)把響應體轉換為OC對象瑟匆,通常是字典或數(shù)組)
    [manager GET:@"http://120.25.226.186:32812/login" parameters:param success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
            NSLog(@"請求成功---%@",[responseObject class]);

    } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
        NSLog(@"失敗---%@",error);
    }];
}

AFHTTPRequestOperationManager發(fā)送網(wǎng)絡請求(過期不用)

-(void)get2
{
    //1.創(chuàng)建AFHTTPRequestOperationManager管理者
    //AFHTTPRequestOperationManager內(nèi)部是基于NSURLConnection實現(xiàn)的
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    //2.發(fā)送請求
    /*
     http://120.25.226.186:32812/login?username=ee&pwd=ee&type=JSON
     第一個參數(shù):NSString類型的請求路徑,AFN內(nèi)部會自動將該路徑包裝為一個url并創(chuàng)建請求對象
     第二個參數(shù):請求參數(shù)栽惶,以字典的方式傳遞,AFN內(nèi)部會判斷當前是POST請求還是GET請求疾嗅,以選擇直接拼接還是轉換為NSData放到請求體中傳遞
     第三個參數(shù):請求成功之后回調(diào)Block
     第四個參數(shù):請求失敗回調(diào)Block
     */

    NSDictionary *param = @{
                            @"username":@"520it",
                            @"pwd":@"520it"
                            };

    //注意:字符串中不能包含空格
    [manager GET:@"http://120.25.226.186:32812/login" parameters:param success:^(AFHTTPRequestOperation * _Nonnull operation, id  _Nonnull responseObject) {

        NSLog(@"請求成功---%@",responseObject);

    } failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) {
            NSLog(@"失敗---%@",error);
    }];
}

AFN取消網(wǎng)絡請求

// 取消所有請求
for (NSURLSessionTask *task in self.manager.tasks) {
    [task cancel];
}

// 取消所有請求
[self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];

// 關閉NSURLSession + 取消所有請求
// NSURLSession一旦被關閉了, 就不能再發(fā)請求
[self.manager invalidateSessionCancelingTasks:YES];

// 注意: 一個請求任務被取消了(cancel), 會自動調(diào)用AFN請求的failure這個block, block中傳入error參數(shù)的code是NSURLErrorCancelled

AFN下載

-(void)download
{
    //1.創(chuàng)建一個管理者
    AFHTTPSessionManager *manage  = [AFHTTPSessionManager manager];

    //2.下載文件
    /*
     第一個參數(shù):請求對象
     第二個參數(shù):下載進度
     第三個參數(shù):block回調(diào)外厂,需要返回一個url地址,用來告訴AFN下載文件的目標地址
         targetPath:AFN內(nèi)部下載文件存儲的地址代承,tmp文件夾下
         response:請求的響應頭
         返回值:文件應該剪切到什么地方
     第四個參數(shù):block回調(diào)汁蝶,當文件下載完成之后調(diào)用
        response:響應頭
        filePath:文件存儲在沙盒的地址 == 第三個參數(shù)中block的返回值
        error:錯誤信息
     */

    //2.1 創(chuàng)建請求對象
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_02.png"]];

    //2.2 創(chuàng)建下載進度,并監(jiān)聽
    NSProgress *progress = nil;

    NSURLSessionDownloadTask *downloadTask = [manage downloadTaskWithRequest:request progress:&progress destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {

        NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];

        //拼接文件全路徑
        NSString *fullpath = [caches stringByAppendingPathComponent:response.suggestedFilename];
        NSURL *filePathUrl = [NSURL fileURLWithPath:fullpath];
        return filePathUrl;

    } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nonnull filePath, NSError * _Nonnull error) {

        NSLog(@"文件下載完畢---%@",filePath);
    }];

    //2.3 使用KVO監(jiān)聽下載進度
    [progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil];

    //3.啟動任務
    [downloadTask resume];
}

//獲取并計算當前文件的下載進度
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(NSProgress *)progress change:(NSDictionary<NSString *,id> *)change context:(void *)context
{
    NSLog(@"%zd--%zd--%f",progress.completedUnitCount,progress.totalUnitCount,1.0 * progress.completedUnitCount/progress.totalUnitCount);
}

AFNUpLoad(上傳)

  • 文件上傳方式
    1. 文件上傳拼接數(shù)據(jù)的第一種方式
    [formData appendPartWithFileData:data name:@"file" fileName:@"xxoo.png" mimeType:@"application/octet-stream"];
    2. 文件上傳拼接數(shù)據(jù)的第二種方式
    [formData appendPartWithFileURL:fileUrl name:@"file" fileName:@"xx.png" mimeType:@"application/octet-stream" error:nil];
    3. 文件上傳拼接數(shù)據(jù)的第三種方式
    [formData appendPartWithFileURL:fileUrl name:@"file" error:nil];
    4. 【注】在資料中已經(jīng)提供了一個用于文件上傳的分類论悴。
  1. 文件上傳相關的代碼如下
    -(void)upload
    {
        //1.創(chuàng)建一個請求管理者
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
        //2.發(fā)送POST請求上傳數(shù)據(jù)
        /*
         第一個參數(shù):請求路徑:NSString類型
         第二個參數(shù):要上傳的非文件參數(shù)
         第三個參數(shù):block回調(diào)
            在該回調(diào)中掖棉,需要利用formData拼接即將上傳的二進制數(shù)據(jù)
         第三個參數(shù):上傳成功的block回調(diào)
            task:dataTask(任務)
            responseObject:服務器返回的數(shù)據(jù)
         第四個參數(shù):上傳失敗的block回調(diào)
            error:錯誤信息,如果上傳文件失敗膀估,那么error里面包含了錯誤的描述信息
         */
    
        NSDictionary *dict = @{
                               @"username":@"wenidngding"
                               };
    
        [manager POST:@"http://120.25.226.186:32812/upload" parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
    
            //把本地的圖片轉換為NSData類型的數(shù)據(jù)
            UIImage *image = [UIImage imageNamed:@"123"];
            NSData *data = UIImagePNGRepresentation(image);
    
            /*
             //拼接二進制文件數(shù)據(jù)
             第一個參數(shù):要上傳的文件的二進制數(shù)據(jù)
             第二個參數(shù):服務器接口規(guī)定的名稱
             第三個參數(shù):這個參數(shù)上傳到服務器之后用什么名字來進行保存
             第四個參數(shù):上傳文件的MIMEType類型
             */
            [formData appendPartWithFileData:data name:@"file" fileName:@"xxoo.png" mimeType:@"application/octet-stream"];
    
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
            NSLog(@"請求成功---%@",responseObject);
    
        } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
            NSLog(@"請求失敗--%@",error);
        }];
    }
    
    -(void)upload2
    {
        NSLog(@"%s",__func__);
    
        //1.創(chuàng)建一個請求管理者
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
        //2.發(fā)送POST請求上傳數(shù)據(jù)
        /*
         第一個參數(shù):請求路徑:NSString類型
         第二個參數(shù):要上傳的非文件參數(shù)
         第三個參數(shù):block回調(diào)
         在該回調(diào)中幔亥,需要利用formData拼接即將上傳的二進制數(shù)據(jù)
         第三個參數(shù):上傳成功的block回調(diào)
         task:dataTask(任務)
         responseObject:服務器返回的數(shù)據(jù)
         第四個參數(shù):上傳失敗的block回調(diào)
         error:錯誤信息,如果上傳文件失敗察纯,那么error里面包含了錯誤的描述信息
         */
    
        NSDictionary *dict = @{
                               @"username":@"wenidngding"
                               };
    
        [manager POST:@"http://120.25.226.186:32812/upload" parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
    
            //本地文件的url
            NSURL *fileUrl = [NSURL fileURLWithPath:@"/Users/文頂頂/Desktop/KF[WTI`AQ3T`A@3R(B96D89.gif"];
            /*
             //拼接二進制文件數(shù)據(jù)
             第一個參數(shù):要上傳文件的url路徑
             第二個參數(shù):服務器要求的參數(shù)名稱
             第三個參數(shù):這個文件上傳到服務器之后叫什么名稱
             第四個參數(shù):文件的mimetype類型
             第五個參數(shù):錯誤信息
             */
    //        [formData appendPartWithFileURL:fileUrl name:@"file" fileName:@"xx.png" mimeType:@"application/octet-stream" error:nil];
    
            //另外一種上傳文件的方式
            /*
             說明:該方法和上面的方法等價帕棉,不過該方法更加簡單其內(nèi)部會自動的的根據(jù)url路徑確定文件保存名稱,并通過內(nèi)部方法獲取上傳文件的mimetype類型
             */
            [formData appendPartWithFileURL:fileUrl name:@"file" error:nil];
    
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
            NSLog(@"請求成功---%@",responseObject);
    
        } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
            NSLog(@"請求失敗--%@",error);
        }];
    }
    

AFNSerializer(序列化處理)

  1. AFN它內(nèi)部默認把服務器響應的數(shù)據(jù)當做json來進行解析饼记,所以如果服務器返回給我的不是JSON數(shù)據(jù)那么請求報錯香伴,這個時候需要設置AFN對響應信息的解析方式。

  2. AFN提供了三種解析響應信息的方式具则,分別是:
    1)AFXMLParserResponseSerializer----XML
    2) AFHTTPResponseSerializer---------默認二進制響應數(shù)據(jù)
    3)AFJSONResponseSerializer---------JSON

  3. 還有一種情況就是服務器返回給我們的數(shù)據(jù)格式不太一致(開發(fā)者工具Content-Type:text/html),那么這種情況也有可能請求不成功即纲。解決方法:
    1) 直接在源代碼中修改,添加相應的Content-Type
    2) 拿到這個屬性博肋,添加到它的集合中

  4. 相關代碼

    -(void)srializer
    {
        //1.創(chuàng)建請求管理者低斋,內(nèi)部基于NSURLSession
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
        /* 知識點1:設置AFN采用什么樣的方式來解析服務器返回的數(shù)據(jù)*/
    
        //如果返回的是XML,那么告訴AFN束昵,響應的時候使用XML的方式解析
        manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
    
        //如果返回的就是二進制數(shù)據(jù)拔稳,那么采用默認二進制的方式來解析數(shù)據(jù)
        //manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    
        //采用JSON的方式來解析數(shù)據(jù)
        //manager.responseSerializer = [AFJSONResponseSerializer serializer];
    
        /*知識點2 告訴AFN,再序列化服務器返回的數(shù)據(jù)的時候锹雏,支持此種類型
        [AFJSONResponseSerializer serializer].acceptableContentTypes = [NSSet setWithObject:@"text/html"];
    
        // 2.把所有的請求參數(shù)通過字典的方式來裝載巴比,GET方法內(nèi)部會自動把所有的鍵值對取出以&符號拼接并最后用?符號連接在請求路徑后面
        NSDictionary *dict = @{
                               @"username":@"223",
                               @"pwd":@"ewr",
                               @"type":@"XML"
                               };
    
        //3.發(fā)送GET請求
        [manager GET:@"http://120.25.226.186:32812/login" parameters:dict success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
    
            //4.請求成功的回調(diào)block
            NSLog(@"%@",[responseObject class]);
    
        } failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
    
            //5.請求失敗的回調(diào),可以打印error的值查看錯誤信息
            NSLog(@"%@",error);
        }];
    }
    

AFN序列化處理示例

  1. JSON序列化
    -(void)JSON
    {
        NSLog(@"=--------");
        //1.創(chuàng)建會話管理者
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
        //有三種方式解析
        /*
         XML
         JSON
         Http默認
         */
    //    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
        //如果不設置的話那么默認就是這樣處理的
    //    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    
        //2.發(fā)送請求
        [manager GET:@"http://120.25.226.186:32812/resources/images/minion_03.png" parameters:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
    
            NSLog(@"請求成功---%@",responseObject);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"請求失敗---%@",error);
        }];
    
    }
    
  • html序列化

    -(void)html
    {
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
        //有三種方式解析,需要手動設置AFN里面的方法轻绞?采记??
        //content-type: text/html"
        manager.responseSerializer = [AFHTTPResponseSerializer serializer];
        manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
    
        //2.發(fā)送請求
        [manager GET:@"http://www.baidu.com" parameters:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
    
            NSLog(@"請求成功---%@",[[NSString alloc]initWithData:responseObject encoding:NSUTF8StringEncoding]);
    
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"請求失敗---%@",error);
        }];
    }
    
  • xml序列化

    -(void)xml
    {
        NSLog(@"=--------");
        //1.創(chuàng)建會話管理者
        AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    
        //有三種方式解析
        /*
         XML
         JSON
         Http默認
         */
        manager.responseSerializer = [AFXMLParserResponseSerializer serializer];
    
        NSDictionary *dict = @{
                               @"type":@"XML"
                               };
    
        //2.發(fā)送請求
        [manager POST:@"http://120.25.226.186:32812/video" parameters:dict success:^(NSURLSessionDataTask * _Nonnull task, id  _Nonnull responseObject) {
    
    //        NSXMLParser *parser = responseObject;
    //
    //        parser.delegate = self;
    //
    //        [parser parse];
    
            NSLog(@"請求成功---%@",responseObject);
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"請求失敗---%@",error);
        }];
    
    }
    
    -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict
    {
        NSLog(@"%@----%@",elementName,attributeDict);
    }
    

網(wǎng)絡監(jiān)測

AFN網(wǎng)絡監(jiān)控政勃,建議在開發(fā)中直接使用AFN框架處理

//1.獲得網(wǎng)絡監(jiān)測管理者
    AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];

    //2.檢測
    /*
     AFNetworkReachabilityStatusUnknown          = 未知
     AFNetworkReachabilityStatusNotReachable     = 沒有網(wǎng)絡
     AFNetworkReachabilityStatusReachableViaWWAN = 3G
     AFNetworkReachabilityStatusReachableViaWiFi = WIFI
     */
    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {

        switch (status) {
            case AFNetworkReachabilityStatusUnknown:
                NSLog(@"未知-----");
                break;
            case AFNetworkReachabilityStatusNotReachable:
                NSLog(@"沒有網(wǎng)絡");
                break;
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"3G");
                break;
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"wifi");
                break;

            default:
                break;
        }
    }];

    //3.開始監(jiān)聽
    [manager startMonitoring];

提示:要監(jiān)控網(wǎng)絡連接狀態(tài)唧龄,必須要先調(diào)用單例的startMonitoring方法

蘋果原生Reachability網(wǎng)絡監(jiān)測

  1. 使用蘋果提供的Reachability來檢測網(wǎng)絡狀態(tài),如果要持續(xù)監(jiān)聽網(wǎng)絡狀態(tài)的概念奸远,需要結合通知一起使用既棺。
  2. Reachability下載地址
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
    {
        //1.注冊一個通知
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkChange) name:kReachabilityChangedNotification object:nil];
    
        //2.拿到一個對象,然后調(diào)用開始監(jiān)聽方法
        Reachability *r = [Reachability reachabilityForInternetConnection];
        [r startNotifier];
    
        //持有該對象懒叛,不要讓該對象釋放掉
        self.r = r;
    }
    
    //當控制器釋放的時候丸冕,移除通知的監(jiān)聽
    -(void)dealloc
    {
        [[NSNotificationCenter defaultCenter] removeObserver:self];
        [self.r stopNotifier];
    }
    
    -(void)networkChange
    {
        //獲取當前網(wǎng)絡的狀態(tài)
       if ([Reachability reachabilityForInternetConnection].currentReachabilityStatus == ReachableViaWWAN)
        {
            NSLog(@"當前網(wǎng)絡狀態(tài)為3G");
            return;
        }
    
        if ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == ReachableViaWiFi)
        {
            NSLog(@"當前網(wǎng)絡狀態(tài)為wifi");
            return;
        }
    
        NSLog(@"當前沒有網(wǎng)絡");
    }
    

AFN其他資料

  1. AFNetworking 概述(一)
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市薛窥,隨后出現(xiàn)的幾起案子胖烛,更是在濱河造成了極大的恐慌,老刑警劉巖诅迷,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佩番,死亡現(xiàn)場離奇詭異,居然都是意外死亡罢杉,警方通過查閱死者的電腦和手機趟畏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屑那,“玉大人拱镐,你說我怎么就攤上這事〕旨剩” “怎么了沃琅?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蜘欲。 經(jīng)常有香客問我益眉,道長,這世上最難降的妖魔是什么姥份? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任郭脂,我火速辦了婚禮,結果婚禮上澈歉,老公的妹妹穿的比我還像新娘展鸡。我一直安慰自己,他們只是感情好埃难,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布莹弊。 她就那樣靜靜地躺著涤久,像睡著了一般。 火紅的嫁衣襯著肌膚如雪忍弛。 梳的紋絲不亂的頭發(fā)上响迂,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天,我揣著相機與錄音细疚,去河邊找鬼蔗彤。 笑死,一個胖子當著我的面吹牛疯兼,可吹牛的內(nèi)容都是我干的然遏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼吧彪,長吁一口氣:“原來是場噩夢啊……” “哼啦鸣!你這毒婦竟也來了?” 一聲冷哼從身側響起来氧,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎香拉,沒想到半個月后啦扬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡凫碌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年扑毡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盛险。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞄摊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出苦掘,到底是詐尸還是另有隱情换帜,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布鹤啡,位于F島的核電站惯驼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏递瑰。R本人自食惡果不足惜祟牲,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抖部。 院中可真熱鬧说贝,春花似錦、人聲如沸慎颗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至几颜,卻和暖如春倍试,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛋哭。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工县习, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像拭抬,于是被迫代替她去往敵國和親啤月。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容