網(wǎng)絡(luò)請求之AFNetworking簡單介紹

什么是AFN

  • 全稱是AFNetworking,是對NSURLSession的一層封裝

  • 運行效率沒有ASI高灾杰,但是使用比ASI簡單

  • 在iOS開發(fā)中艳吠,使用比較廣泛

  • AFN的github地址

AFHTTPSessionManager

  • AFHTTPSessionManager
    • 是AFN中最重要的對象之一
    • 封裝了HTTP請求的常見處理
      • GET\POST請求
      • 解析服務(wù)器的響應(yīng)數(shù)據(jù)
      • 創(chuàng)建
AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];

AFNetworking發(fā)送GET請求

// 1. 創(chuàng)建 會話管理者
    AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
    
    NSDictionary * parametersDic = @{
                                       @"username":@"520it",
                                       @"pwd":@"520it",
                                       @"type":@"JSON"
                                       };
    
    // 2.   發(fā)送GET 請求
    /*
     第一參數(shù): 請求路徑(不包含參數(shù))NSString類型
     第二參數(shù): 請求參數(shù) 字典的形勢發(fā)送(發(fā)送給服務(wù)器的數(shù)據(jù)~參數(shù))
     第三參數(shù): progress 進度回調(diào)
     第四參數(shù): success 成功回調(diào)
                task: 請求任務(wù)
                responseObject: 響應(yīng)體信息(JSON ---> OC對象)
     
     第五參數(shù): failure  失敗回調(diào)
                task: 請求任務(wù)
                error: 錯誤信息
     
     響應(yīng)頭: task.response
     */
    [manager GET:@"http://120.25.226.186:32812/login" parameters:parametersDic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        NSLog(@"%@--------%@",[responseObject class],responseObject);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        NSLog(@"請求失敗---- %@",error);
        
    }];

AFNetworking 發(fā)送POST請求

AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
    
    NSDictionary * parametersDic = @{
                                     @"username":@"520it",
                                     @"pwd":@"520it",
                                     @"type":@"JSON"
                                     };
    
    // 發(fā)送POST請求
    /*
     第一參數(shù): 請求路徑(不包含參數(shù))NSString類型
     第二參數(shù): 請求參數(shù) 字典的形勢發(fā)送(發(fā)送給服務(wù)器的數(shù)據(jù)~參數(shù))
     第三參數(shù): progress 進度回調(diào)
     第四參數(shù): success 成功回調(diào)
     task: 請求任務(wù)
     responseObject: 響應(yīng)體信息(JSON ---> OC對象)
     
     第五參數(shù): failure  失敗回調(diào)
     task: 請求任務(wù)
     error: 錯誤信息
     
     響應(yīng)頭: task.response
     */
    [manager POST:@"http://120.25.226.186:32812/login" parameters:parametersDic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        NSLog(@"%@--------%@",[responseObject class],responseObject);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        NSLog(@"請求失敗---- %@",error);
    }];
  • AFNetworking GET請求和POST請求的具體代碼如下:

#define SCREENWIDTH [UIScreen mainScreen].bounds.size.width
#define SCREENHEIGHT [UIScreen mainScreen].bounds.size.height

#import "ViewController.h"
#import "AFNetworking.h"

@interface ViewController ()

@property (nonatomic,strong) UIButton * btn;

@end

@implementation ViewController

-(UIButton *)btn
{
    if (!_btn) {
        _btn = [UIButton buttonWithType:UIButtonTypeCustom];
        
        _btn.frame = CGRectMake(SCREENWIDTH / 2 - 75, SCREENHEIGHT / 2 - 15, 150, 30);
        [_btn setTitle:@"點擊" forState:UIControlStateNormal];
        [_btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
        [_btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
        
    }
    return _btn;
}

-(void)clickBtn:(UIButton *)btn
{
//    [self getAFNetworking];
    
    [self postAFNetworking];
}


- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self.view addSubview:self.btn];
}

-(void)getAFNetworking
{
    // 1. 創(chuàng)建 會話管理者
    AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
    
    NSDictionary * parametersDic = @{
                                       @"username":@"520it",
                                       @"pwd":@"520it",
                                       @"type":@"JSON"
                                       };
    
    // 2.   發(fā)送GET 請求
    /*
     第一參數(shù): 請求路徑(不包含參數(shù))NSString類型
     第二參數(shù): 請求參數(shù) 字典的形勢發(fā)送(發(fā)送給服務(wù)器的數(shù)據(jù)~參數(shù))
     第三參數(shù): progress 進度回調(diào)
     第四參數(shù): success 成功回調(diào)
                task: 請求任務(wù)
                responseObject: 響應(yīng)體信息(JSON ---> OC對象)
     
     第五參數(shù): failure  失敗回調(diào)
                task: 請求任務(wù)
                error: 錯誤信息
     
     響應(yīng)頭: task.response
     */
    [manager GET:@"http://120.25.226.186:32812/login" parameters:parametersDic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        NSLog(@"%@--------%@",[responseObject class],responseObject);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        NSLog(@"請求失敗---- %@",error);
        
    }];
    
    
}

-(void)postAFNetworking
{
    AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
    
    NSDictionary * parametersDic = @{
                                     @"username":@"520it",
                                     @"pwd":@"520it",
                                     @"type":@"JSON"
                                     };
    
    // 發(fā)送POST請求
    /*
     第一參數(shù): 請求路徑(不包含參數(shù))NSString類型
     第二參數(shù): 請求參數(shù) 字典的形勢發(fā)送(發(fā)送給服務(wù)器的數(shù)據(jù)~參數(shù))
     第三參數(shù): progress 進度回調(diào)
     第四參數(shù): success 成功回調(diào)
     task: 請求任務(wù)
     responseObject: 響應(yīng)體信息(JSON ---> OC對象)
     
     第五參數(shù): failure  失敗回調(diào)
     task: 請求任務(wù)
     error: 錯誤信息
     
     響應(yīng)頭: task.response
     */
    [manager POST:@"http://120.25.226.186:32812/login" parameters:parametersDic progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        NSLog(@"%@--------%@",[responseObject class],responseObject);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        NSLog(@"請求失敗---- %@",error);
    }];
    
}

@end

AFNetworking實現(xiàn)文件下載

不多說了栏渺,直接上代碼磕诊,操作簡單明了

#define SCREENWIDTH [UIScreen mainScreen].bounds.size.width
#define SCREENHEIGHT [UIScreen mainScreen].bounds.size.height

#import "ViewController.h"
#import "AFNetworking.h"

@interface ViewController ()

@property (nonatomic,strong) UIButton * btn;

@end

@implementation ViewController

-(UIButton *)btn
{
   if (!_btn) {
       _btn = [UIButton buttonWithType:UIButtonTypeCustom];
       
       _btn.frame = CGRectMake(SCREENWIDTH / 2 - 75, SCREENHEIGHT / 2 - 15, 150, 30);
       [_btn setTitle:@"點擊" forState:UIControlStateNormal];
       [_btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
       [_btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
       
   }
   return _btn;
}

-(void)clickBtn:(UIButton *)btn
{
   [self getAFNetworking];
}


- (void)viewDidLoad {
   [super viewDidLoad];
   
   [self.view addSubview:self.btn];
}

-(void)getAFNetworking
{
   AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
   
   NSURL * url = [NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_03.mp4"];
   
   NSURLRequest * request = [NSURLRequest requestWithURL:url];
   
   // 下載文件
   /*
    第一參數(shù): 請求對象
    第二參數(shù): progress 進度回調(diào) downloadProgress
    第三參數(shù): destination 回調(diào)(目標位置)
               有返回值
               targetPath: 臨時文件路徑
               response: 響應(yīng)頭信息
    第四參數(shù): completionHandler   下載完成之后的回調(diào)
               response: 響應(yīng)頭信息
               filePath: 最終的文件路徑
               error: 錯誤信息
    */
   NSURLSessionDownloadTask * downloadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
       
       // 監(jiān)聽下載進度
       // completedUnitCount 已經(jīng)下載的數(shù)據(jù)大小
       // totalUnitCount 文件數(shù)據(jù)的總大小
       NSLog(@"%f",1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);
       
   } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
       
       NSString * fullPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
       
       fullPath = [fullPath stringByAppendingPathComponent:response.suggestedFilename];
       
       NSLog(@"臨時路徑:%@",targetPath);
       
       NSLog(@"緩存路徑:%@",fullPath);
       
       return [NSURL fileURLWithPath:fullPath];
       
   } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
       
       NSLog(@"%@",filePath);
       
   }];
   
   // 3. 執(zhí)行task
   [downloadTask resume];
}

AFNetworking實現(xiàn)文件上傳

上傳也不多說融痛,以后在慢慢解釋各個參數(shù)

#define SCREENWIDTH [UIScreen mainScreen].bounds.size.width
#define SCREENHEIGHT [UIScreen mainScreen].bounds.size.height

// 設(shè)置boundary的宏
#define Kboundary @"----WebKitFormBoundaryaItGoVAfuLHDoRD4"
#define KNewLine [@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]

#import "ViewController.h"
#import "AFNetworking.h"

@interface ViewController ()

@property (nonatomic,strong) UIButton * btn;

@end

@implementation ViewController

-(UIButton *)btn
{
    if (!_btn) {
        _btn = [UIButton buttonWithType:UIButtonTypeCustom];
        
        _btn.frame = CGRectMake(SCREENWIDTH / 2 - 75, SCREENHEIGHT / 2 - 15, 150, 30);
        [_btn setTitle:@"點擊" forState:UIControlStateNormal];
        [_btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
        [_btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
        
    }
    return _btn;
}

-(void)clickBtn:(UIButton *)btn
{
//    [self upload];
    
    [self upload2];
}


- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self.view addSubview:self.btn];
}

// 不推薦
-(void)upload
{
    // 1. 創(chuàng)建會話管理者
    AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
    
    // 2. 確定URL
    NSURL * url = [NSURL URLWithString:@"http://120.25.226.186:32812/upload"];
    
    // 2.1 創(chuàng)建請求對象
    NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
    
    // 2.2 設(shè)置請求方法
    request.HTTPMethod = @"POST";
    
    // 2.3 設(shè)置請求頭信息
    [request setValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@",Kboundary] forHTTPHeaderField:@"Content-Type"];
    
    // 3. 發(fā)送請求上傳文件
    /*
     第一參數(shù): 請求對象
     第二參數(shù): fromData 二進制數(shù)據(jù) 傳遞要上傳的數(shù)據(jù)(請求體)
     第三參數(shù): progress  進度信息
     第四參數(shù): completionHandler 下載完成后的回調(diào)
     */
     NSURLSessionUploadTask * uploadTask =  [manager uploadTaskWithRequest:request fromData:[self getBodyData] progress:^(NSProgress * _Nonnull uploadProgress) {
        
        NSLog(@"上傳進度:%f", 1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
        
    } completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
        
        NSLog(@"%@",responseObject);
        
    }];
    
    // 執(zhí)行Task
    [uploadTask resume];
}

-(void)upload2
{
    // 1. 創(chuàng)建會話管理者
    AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
    
    NSDictionary * dicM = @{
                            @"username":@"456123",
                            };
    
    // 2. 發(fā)送post請求上傳文件
    /*
     第一參數(shù): 請求路徑
     第二參數(shù): 字典(非文件參數(shù))
     第三參數(shù): constructingBodyWithBlock 處理要上傳的文件數(shù)據(jù)
     第四參數(shù): progress 進度回調(diào)
     第五參數(shù): success 成功回調(diào) responseObject: 響應(yīng)體信息
     第六參數(shù): failure 失敗回調(diào) error: 錯誤信息
     */
    [manager POST:@"http://120.25.226.186:32812/upload" parameters:dicM constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        
        UIImage * image = [UIImage imageNamed:@"靜態(tài)05"];
        
        NSData * imageData = UIImageJPEGRepresentation(image, 0.8);
        
        // 使用formData 來拼接數(shù)據(jù)
        /*
         第一參數(shù): 二進制數(shù)據(jù) 要上傳的文件參數(shù)
         第二參數(shù): 服務(wù)器規(guī)定的
         第三參數(shù): 該文件上傳到服務(wù)器以什么名稱保存
         第四參數(shù): mimeType
         */
//        [formData appendPartWithFileData:imageData name:@"file" fileName:@"允兒" mimeType:@"image/jepg"];
        
        // 方法二
//        [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/WJim/Desktop/播放界面.jpg"] name:@"file" fileName:@"播放" mimeType:@"image/jepg" error:nil];
        
        // 方法三
        [formData appendPartWithFileURL:[NSURL fileURLWithPath:@"/Users/WJim/Desktop/播放界面.jpg"] name:@"file" error:nil];
        
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        
        NSLog(@"上傳進度:%f",1.0 * uploadProgress.completedUnitCount / uploadProgress.totalUnitCount);
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        NSLog(@"上傳成功------%@",responseObject);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        NSLog(@"上傳失敗------%@",error);
        
    }];
    
}

-(NSData *)getBodyData
{
    
    NSMutableData * fileData = [NSMutableData data];
    // 5.1 文件參數(shù)
    /*
     --分隔符
     Content-Disposition: form-data; name="file"; filename="靜態(tài)05.jpg"
     Content-Type: image/jpeg(MIMEType:大類型/小類型)
     空行
     文件參數(shù)
     */
    
    NSData * oneData = [[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding];
    
    [fileData appendData:oneData];
    // 把換行添加進請求體數(shù)據(jù)中
    [fileData appendData:KNewLine];
    // name:file 服務(wù)器規(guī)定的參數(shù)
    // filename: 靜態(tài)05.jpg 文件保存到服務(wù)器上面的名稱
    // Content-Type: 文件的類型
    NSData * twoData = [@"Content-Disposition: form-data; name=\"file\"; filename=\"靜態(tài)05.jpg\"" dataUsingEncoding:NSUTF8StringEncoding];
    
    [fileData appendData:twoData];
    [fileData appendData:KNewLine];
    
    NSData * thirdlyData = [@"Content-Type: image/jpeg" dataUsingEncoding:NSUTF8StringEncoding];
    [fileData appendData:thirdlyData];
    [fileData appendData:KNewLine];
    [fileData appendData:KNewLine];
    
    UIImage * image = [UIImage imageNamed:@"靜態(tài)05"];
    // UIImage --> NSData
    NSData * imageData = UIImageJPEGRepresentation(image, 0.5);
    [fileData appendData:imageData];
    [fileData appendData:KNewLine];
    
    // 5.2 非文件參數(shù)
    /*
     --分隔符
     Content-Disposition: form-data; name="username"
     空行
     456123
     */
    NSData * sixthData = [[NSString stringWithFormat:@"--%@",Kboundary] dataUsingEncoding:NSUTF8StringEncoding];
    
    [fileData appendData:sixthData];
    [fileData appendData:KNewLine];
    
    NSData * seventhData = [@"Content-Disposition: form-data; name=\"username\"" dataUsingEncoding:NSUTF8StringEncoding];
    [fileData appendData:seventhData];
    [fileData appendData:KNewLine];
    [fileData appendData:KNewLine];
    
    NSData * ninthData = [@"456123" dataUsingEncoding:NSUTF8StringEncoding];
    [fileData appendData:ninthData];
    [fileData appendData:KNewLine];
    
    
    // 5.3 結(jié)尾標識
    NSData * tenthData = [[NSString stringWithFormat:@"--%@--",Kboundary] dataUsingEncoding:NSUTF8StringEncoding];
    
    [fileData appendData:tenthData];
    
    return fileData;
    
}

@end

監(jiān)控聯(lián)網(wǎng)狀態(tài)

AFNetworkReachabilityManager *manager = [AFNetworkReachabilityManager sharedManager];
[manager startMonitoring];

[manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
    NSLog(@"%d", status);
}];

具體代碼如下:

#define SCREENWIDTH [UIScreen mainScreen].bounds.size.width
#define SCREENHEIGHT [UIScreen mainScreen].bounds.size.height

#import "ViewController.h"

#import "AFNetworking.h"

@interface ViewController ()

@property(nonatomic,strong) UIButton * btn;

@end

@implementation ViewController

-(UIButton *)btn
{
    if (!_btn) {
        _btn = [UIButton buttonWithType:UIButtonTypeCustom];
        
        _btn.frame = CGRectMake(SCREENWIDTH / 2 - 75, SCREENHEIGHT / 2 - 15, 150, 30);
        [_btn setTitle:@"點擊" forState:UIControlStateNormal];
        [_btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
        [_btn addTarget:self action:@selector(clickBtn:) forControlEvents:UIControlEventTouchUpInside];
        
    }
    return _btn;
}

-(void)clickBtn:(UIButton *)btn
{
   [self AFN];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self.view addSubview:self.btn];
}

- (void)AFN
{
    // 1. 獲得一個網(wǎng)絡(luò)狀態(tài)監(jiān)測管理者
    AFNetworkReachabilityManager * manager = [AFNetworkReachabilityManager sharedManager];
    
    // 2. 監(jiān)聽狀態(tài)的改變
    /*
     AFNetworkReachabilityStatusUnknown          = -1,      未知
     AFNetworkReachabilityStatusNotReachable     = 0,       沒有網(wǎng)絡(luò)
     AFNetworkReachabilityStatusReachableViaWWAN = 1,       蜂窩網(wǎng)絡(luò)
     AFNetworkReachabilityStatusReachableViaWiFi = 2,       Wifi
     */
    [manager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        
        switch (status) {
            case AFNetworkReachabilityStatusReachableViaWWAN:
                NSLog(@"蜂窩網(wǎng)絡(luò)");
                break;
            case AFNetworkReachabilityStatusReachableViaWiFi:
                NSLog(@"Wifi");
                break;
            case AFNetworkReachabilityStatusNotReachable :
                NSLog(@"沒有網(wǎng)絡(luò)");
                break;
            case AFNetworkReachabilityStatusUnknown:
                NSLog(@"未知錯誤");
                break;
            default:
                break;
        }
        
    }];
    
    // 開始監(jiān)聽
    [manager startMonitoring];
}

@end
  • 提示:要監(jiān)控網(wǎng)絡(luò)連接狀態(tài)责语,必須要先調(diào)用單例的startMonitoring方法
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坤候,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子智末,更是在濱河造成了極大的恐慌,老刑警劉巖送漠,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件由蘑,死亡現(xiàn)場離奇詭異尼酿,居然都是意外死亡,警方通過查閱死者的電腦和手機裳擎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門句惯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拷淘,你說我怎么就攤上這事指孤。” “怎么了结洼?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵叉跛,是天一觀的道長。 經(jīng)常有香客問我鸣峭,道長酥艳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任莫换,我火速辦了婚禮拉岁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘膛薛。我一直安慰自己哄啄,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布沪么。 她就那樣靜靜地躺著锌半,像睡著了一般。 火紅的嫁衣襯著肌膚如雪殉摔。 梳的紋絲不亂的頭發(fā)上记焊,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天遍膜,我揣著相機與錄音,去河邊找鬼瓢颅。 笑死,一個胖子當著我的面吹牛翰意,可吹牛的內(nèi)容都是我干的巾兆。 我是一名探鬼主播虎囚,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼淘讥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了窒朋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤榔至,失蹤者是張志新(化名)和其女友劉穎欺劳,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枫弟,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡鹏往,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年伊履,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宙攻。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡韵吨,死狀恐怖霹购,靈堂內(nèi)的尸體忽然破棺而出溢陪,到底是詐尸還是另有隱情睛廊,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布咆霜,位于F島的核電站嘶朱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏脉课。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一唱遭、第九天 我趴在偏房一處隱蔽的房頂上張望呈驶。 院中可真熱鬧,春花似錦跌穗、人聲如沸虏辫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娄昆。三九已至,卻和暖如春哺眯,著一層夾襖步出監(jiān)牢的瞬間扒俯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工夺姑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掌猛,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓废膘,卻偏偏與公主長得像丐黄,于是被迫代替她去往敵國和親坊萝。 傳聞我的和親對象是個殘疾皇子许起,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

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