基于AFNetworking封装的HttpsRequest类

首先说明下为什么要自己封装一层这个类,因为项目需要,不同的接口实现不同的通信协议,所以自己封装了一层来控制相关的类来处理一些操作!比如Get、Post、Put、Delete...
这个类也是主要封装了以上几个方法!

—————————————————————————————————————————————————————————————
我用了cocoaPods来管理AFNetworking。这个应该不用再说明怎么导入使用这个类库了吧!
这里面还用到了UICKeyChainStore这个存储信息的第三方类
PDToast 还用了我自己写的的一个动态库PDFramework里面的一个功能
http://www.jianshu.com/writer#/notebooks/5366058/notes/4998769
—————————————————————————————————————————————————————————————
下面来说重点:

HttpsRequest.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@interface HttpsRequest : NSObject

+(HttpsRequest *)getInstance;

- (void)GetData:(NSMutableDictionary *)params :(NSString *)url andBlock:(void(^)(id requsetStr))block;

- (void)PostData:(NSMutableDictionary *)params :(NSString *)url andBlock:(void(^)(id requsetStr))block;

- (void)PUTData:(NSMutableDictionary *)params :(NSString *)url andBlock:(void(^)(id requsetStr))block;

- (void)DeleteData:(NSMutableDictionary *)params :(NSString *)url andBlock:(void(^)(id requsetStr))block;

@property (nonatomic, retain) UIView *selfView;

@end
HttpsRequest.m

#import "HttpsRequest.h"
#import <AFNetworking.h>
#import <CommonCrypto/CommonDigest.h>
#import "General.h"//这个是写配置的文件(这个文件里面写了一些宏定义,如果你需要直接使用这两个类的话,拷贝代码报警告或者错误的话,自行修改错误的地方吧!)

@implementation HttpsRequest

static AFHTTPSessionManager *manager;
static HttpsRequest *httpsRequest;
NSString *MyUrl;
NSMutableDictionary *Mydic;
UIView  *errorView;

+(instancetype)getInstance
{
    if (httpsRequest ==nil) {
        httpsRequest = [[HttpsRequest alloc]init];
    }
    
    
    if (manager ==nil) {
        manager = [AFHTTPSessionManager  manager];
    }
    
    
    return httpsRequest;
}

- (instancetype)init
{
    self = [super init];
    return self;
}

- (void)GetData:(NSMutableDictionary *)params :(NSString *)url andBlock:(void(^)(id requsetStr))block{
    if (params == nil) {
        params = [NSMutableDictionary new];
    }
    manager=[AFHTTPSessionManager manager];
    manager.securityPolicy=[AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
    manager.requestSerializer=[AFJSONRequestSerializer serializer];
    manager.responseSerializer=[AFJSONResponseSerializer serializer];
    [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    
    if (ISLOGIN) {
        [manager.requestSerializer setValue:[UICKeyChainStore stringForKey:@"sessionID" service:keychainValue] forHTTPHeaderField:@"sid"];
    }
    
    [manager GET:url parameters:params progress:^(NSProgress * _Nonnull uploadProgress) {
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        //        NSLog(@"请求成功:%@", responseObject);
        if (errorView) {
            [errorView removeFromSuperview];
            errorView = nil;
        }
        NSDictionary *JSON = [[NSDictionary alloc]initWithDictionary:responseObject];
        NSLog(@"%@ 请求成功JSON:%@", url, JSON);
        if ([[NSString stringWithFormat:@"%@",[JSON objectForKey:@"result"]]isEqualToString:@"1"]) {
            
            if ([[NSString stringWithFormat:@"%@",[JSON objectForKey:@"data"]]isEqualToString:@"<null>"]) {
                block(JSON);
                return ;
            }
            if ([[JSON objectForKey:@"data"] isKindOfClass:[NSString class]] || [[JSON objectForKey:@"data"] isKindOfClass:[NSNumber class]]) {
                block(JSON);
                return ;
            }
            else
            {
                block([JSON objectForKey:@"data"]);
            }
        }
        else
        {
            if ([[JSON objectForKey:@"error"] integerValue] ==1001) {
                [self autoLoginInBySid:1 :@"" :params :url andBlock:^(id requestStr) {
                    block(requestStr);
                }];
            } else{
                [self showErrorInfo:[[JSON objectForKey:@"error"] integerValue] :params :url];
                block(@"0");
            }
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        [PDToast hiddenActivity];
        NSLog(@"请求失败:%@", error.description);
        NSString *str =@"error";
        if ([[PDObject getInstance] isNetworkEnabled] == YES) {
            
        }else
        {
            
            if (errorView) {
                [errorView removeFromSuperview];
                errorView = nil;
            }
            errorView = [[UIView alloc]initWithFrame:_selfView.bounds];
            [self.selfView addSubview:errorView];
        }
        block(str);
        
    }];
    

    
    
}
- (void)PostData:(NSMutableDictionary *)params :(NSString *)url andBlock:(void(^)(id requsetStr))block{
    if (params == nil) {
        params = [NSMutableDictionary new];
    }
    manager=[AFHTTPSessionManager manager];
    manager.securityPolicy=[AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
    manager.requestSerializer=[AFJSONRequestSerializer serializer];
    manager.responseSerializer=[AFJSONResponseSerializer serializer];
    [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [manager.requestSerializer setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
 
    if (ISLOGIN) {
        [manager.requestSerializer setValue:[UICKeyChainStore stringForKey:@"sessionID" service:keychainValue] forHTTPHeaderField:@"sid"];
    }
    else
    {
        [manager.requestSerializer setValue:nil forHTTPHeaderField:@"sid"];
    }

    [manager POST:url parameters:params progress:^(NSProgress * _Nonnull uploadProgress) {
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        //        NSLog(@"请求成功:%@", responseObject);
        if (errorView) {
            [errorView removeFromSuperview];
            errorView = nil;
        }
        NSDictionary *JSON = [[NSDictionary alloc]initWithDictionary:responseObject];
        NSLog(@"%@ 请求成功JSON:%@", url, JSON);
        if ([[NSString stringWithFormat:@"%@",[JSON objectForKey:@"result"]]isEqualToString:@"1"]) {
            
            if ([[NSString stringWithFormat:@"%@",[JSON objectForKey:@"data"]]isEqualToString:@"<null>"]) {
                block(JSON);
                return ;
            }
            if ([[JSON objectForKey:@"data"] isKindOfClass:[NSString class]] || [[JSON objectForKey:@"data"] isKindOfClass:[NSNumber class]]) {
                block(JSON);
                return ;
            }
            else
            {
                block([JSON objectForKey:@"data"]);
            }
        }
        else
        {
            if ([[JSON objectForKey:@"error"] integerValue] ==1001) {
                [self autoLoginInBySid:1 :@"" :params :url andBlock:^(id requestStr) {
                    block(requestStr);
                }];
            } else{
                [self showErrorInfo:[[JSON objectForKey:@"error"] integerValue] :params :url];
                block(@"0");
            }
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        [PDToast hiddenActivity];
        NSLog(@"请求失败:%@", error.description);
        NSString *str =@"error";
        if ([[PDObject getInstance] isNetworkEnabled] == YES) {
            
        }else
        {
            
            if (errorView) {
                [errorView removeFromSuperview];
                errorView = nil;
            }
            errorView = [[UIView alloc]initWithFrame:_selfView.bounds];
            [self.selfView addSubview:errorView];
        }
        block(str);
        
    }];
    

    
}

- (void)PUTData:(NSMutableDictionary *)params :(NSString *)url andBlock:(void(^)(id requsetStr))block{
    
    manager=[AFHTTPSessionManager manager];
    manager.securityPolicy=[AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
    manager.requestSerializer=[AFJSONRequestSerializer serializer];
    manager.responseSerializer=[AFJSONResponseSerializer serializer];
    [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [manager.requestSerializer setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    //[manager.requestSerializer setValue:@"text/html;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    
    
    if (ISLOGIN) {
        [manager.requestSerializer setValue:[UICKeyChainStore stringForKey:@"sessionID" service:keychainValue] forHTTPHeaderField:@"sid"];
    }
    [manager PUT:url parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        if (errorView) {
            [errorView removeFromSuperview];
            errorView = nil;
        }
        NSDictionary *JSON = [[NSDictionary alloc]initWithDictionary:responseObject];
        NSLog(@"%@ 请求成功JSON:%@", url, JSON);
        if ([[NSString stringWithFormat:@"%@",[JSON objectForKey:@"result"]]isEqualToString:@"1"]) {
            
            if ([[NSString stringWithFormat:@"%@",[JSON objectForKey:@"data"]]isEqualToString:@"<null>"]) {
                block(JSON);
                return ;
            }
            if ([[JSON objectForKey:@"data"] isKindOfClass:[NSString class]] || [[JSON objectForKey:@"data"] isKindOfClass:[NSNumber class]]) {
                block(JSON);
                return ;
            }
            else
            {
                block([JSON objectForKey:@"data"]);
            }
        }
        else
        {
            if ([[JSON objectForKey:@"error"] integerValue] ==1001) {
                [self autoLoginInBySid:1 :@"" :params :url andBlock:^(id requestStr) {
                    block(requestStr);
                }];
            } else{
                [self showErrorInfo:[[JSON objectForKey:@"error"] integerValue] :params :url];
                block(@"0");
            }
        }

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        [PDToast hiddenActivity];
        NSLog(@"请求失败:%@", error.description);
        NSString *str =@"error";
        if ([[PDObject getInstance] isNetworkEnabled] == YES) {
            
        }else
        {
            
            if (errorView) {
                [errorView removeFromSuperview];
                errorView = nil;
            }
            errorView = [[UIView alloc]initWithFrame:_selfView.bounds];
            [self.selfView addSubview:errorView];
        }
        block(str);
    }];
    
    
}

- (void)DeleteData:(NSMutableDictionary *)params :(NSString *)url andBlock:(void(^)(id requsetStr))block{
    
    manager=[AFHTTPSessionManager manager];
    manager.securityPolicy=[AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
    manager.requestSerializer=[AFJSONRequestSerializer serializer];
    manager.responseSerializer=[AFJSONResponseSerializer serializer];
    [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
//    [manager.requestSerializer setValue:@"application/json;charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    
    if (ISLOGIN) {
        [manager.requestSerializer setValue:[UICKeyChainStore stringForKey:@"sessionID" service:keychainValue] forHTTPHeaderField:@"sid"];
    }
    [manager DELETE:url parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        if (errorView) {
            [errorView removeFromSuperview];
            errorView = nil;
        }
        NSDictionary *JSON = [[NSDictionary alloc]initWithDictionary:responseObject];
        NSLog(@"%@ 请求成功JSON:%@", url, JSON);
        if ([[NSString stringWithFormat:@"%@",[JSON objectForKey:@"result"]]isEqualToString:@"1"]) {
            
            if ([[NSString stringWithFormat:@"%@",[JSON objectForKey:@"data"]]isEqualToString:@"<null>"]) {
                block(JSON);
                return ;
            }
            if ([[JSON objectForKey:@"data"] isKindOfClass:[NSString class]] || [[JSON objectForKey:@"data"] isKindOfClass:[NSNumber class]]) {
                block(JSON);
                return ;
            }
            else
            {
                block([JSON objectForKey:@"data"]);
            }
        }
        else
        {
            if ([[JSON objectForKey:@"error"] integerValue] ==1001) {
                [self autoLoginInBySid:1 :@"" :params :url andBlock:^(id requestStr) {
                    block(requestStr);
                }];
            } else{
                [self showErrorInfo:[[JSON objectForKey:@"error"] integerValue] :params :url];
                block(@"0");
            }
        }
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        [PDToast hiddenActivity];
        NSLog(@"请求失败:%@", error.description);
        NSString *str =@"error";
        if ([[PDObject getInstance] isNetworkEnabled] == YES) {
            
        }else
        {
            
            if (errorView) {
                [errorView removeFromSuperview];
                errorView = nil;
            }
            errorView = [[UIView alloc]initWithFrame:_selfView.bounds];
            [self.selfView addSubview:errorView];
        }
        block(str);
    }];
    
    
    
}

#pragma mark 类方法

- (NSString*)sha1:(NSString*)input
{
    const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:input.length];
    
    uint8_t digest[CC_SHA1_DIGEST_LENGTH];
    
    CC_SHA1(data.bytes, (unsigned)(long)data.length, digest);
    
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
    
    for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", digest[i]];
    
    return output;
    
}

- (void)showErrorInfo:(NSInteger )errorCode :(NSDictionary *)parms :(NSString *)url
{
    switch (errorCode) {
        case 0:
            NSLog(@"");
            break;
        case 1001:
//            [PDToast showWithText: @"系统异常,请重新登录" bottomOffset:80];
            break;
        case 2001:
            [PDToast showWithText: @"系统异常,请稍候重试" bottomOffset:80];
            break;
            
        case 4001:
            [PDToast showWithText: @"验证码错误" bottomOffset:80];
            break;
            
        case 4002:
            [PDToast showWithText: @"验证码过期" bottomOffset:80];
            break;
            
        case 4003:
            [PDToast showWithText: @"抵扣的积分超过允许上限" bottomOffset:80];
            break;
            
        case 4004:
            [PDToast showWithText: @"没有足够的积分用来抵扣" bottomOffset:80];
            break;
            
        case 4005:
            [PDToast showWithText: @"找不到用户" bottomOffset:80];
            break;
            
        case 4006:
            [PDToast showWithText: @"找不到商品" bottomOffset:80];
            break;
            
        case 4007:
            [PDToast showWithText: @"已经支付的订单不能取消" bottomOffset:80];
            break;
            
        case 4008:
            [PDToast showWithText: @"没有积分可以赠送" bottomOffset:80];
            break;
            
        case 4009:
            [PDToast showWithText: @"领取积分失败" bottomOffset:80];
            break;
            
        case 4010:
            [PDToast showWithText: @"积分点为0" bottomOffset:80];
            break;
            
        case 4011:
            [PDToast showWithText: @"余额转出申请已经处理过了" bottomOffset:80];
            break;
            
        case 4012:
            [PDToast showWithText: @"账户金额不足" bottomOffset:80];
            break;
            
        case 4013:
            [PDToast showWithText: @"请不要重复申请" bottomOffset:180];
            break;
        case 4014:
            [PDToast showWithText: @"请不要重复注册" bottomOffset:80];
            break;
        case 4015:
            [PDToast showWithText: @"密码错误" bottomOffset:80];
            break;
            
        case 4016:
            [PDToast showWithText: @"推荐商户数不够,申请客户经理失败" bottomOffset:80];
            break;
        case 4017:
            [PDToast showWithText: @"当前时间段不能领积分" bottomOffset:80];
            break;
        case 4018:
            [PDToast showWithText: @"不能自己做积分兑换" bottomOffset:80];
            break;
        case 4019:
            [PDToast showWithText: @"申请已经处理过了" bottomOffset:80];
            break;
        case 4020:
            [PDToast showWithText: @"该区域已经有区域经理了" bottomOffset:80];
            break;
        case 4021:
            [PDToast showWithText: @"此手机号码不是商户" bottomOffset:80];
            break;
        case 4022:
            [PDToast showWithText: @"该区域已经有区域经理了" bottomOffset:80];
            break;
        case 4023:
            [PDToast showWithText: @"此用户已经是区域经理/客户经理" bottomOffset:80];
            break;
        case 4024:
            [PDToast showWithText: @"手动领取积分功能还未开放" bottomOffset:80];
            break;
        case 4025:
            [PDToast showWithText: @"获取验证码太频繁" bottomOffset:80];
            break;
        case 4026:
            [PDToast showWithText: @"工资还未算出,不能查看" bottomOffset:80];
            break;
        case 4027:
            [PDToast showWithText: @"当月工资已经支付过了" bottomOffset:80];
            break;
        default:
            break;
    }
}

基于这个类上面再次封装了一个Server类 专门处理接口的请求数据

Server0.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "HttpsRequest.h"


@interface Server0 : NSObject
+ (Server0 *)getInstance;
- (void)Register:(UIView *)SelfView :(NSMutableDictionary *)dic :(void(^)(id requsetStr))block;
- (void)Login:(UIView *)SelfView :(NSMutableDictionary *)dic :(void(^)(id requsetStr))block;
@end

#import "Server0.h"

@implementation Server0

+(instancetype)getInstance
{
    static Server0 *server;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        server = [[Server0 alloc] init];
    });
    return server;
}

- (instancetype)init
{
    self = [super init];
    
    return self;
}

- (void)Register:(UIView *)SelfView :(NSMutableDictionary *)dic :(void(^)(id requsetStr))block{
    //接口名
    NSString *str = @"/user/register";
    //Url
    NSString *url = [NSString stringWithFormat:@"%@%@",NewReleaseURL,str];
    
    //数据请求
    [HttpsRequest getInstance].selfView = SelfView;
    [[HttpsRequest getInstance] PUTData:dic :url andBlock:^(id requestStr) {
        if ([[NSString stringWithFormat:@"%@",requestStr] isEqualToString:@"error"] || [[NSString stringWithFormat:@"%@",requestStr] isEqualToString:@"0"] ) {
            block(0);
            return;
        }
        else if([[NSString stringWithFormat:@"%@",requestStr] isEqualToString:@"1024"])
        {
            block(@"1024");
            return;
        }
        else if([[NSString stringWithFormat:@"%@",requestStr] isEqualToString:@"2048"])
        {
            block(@"2048");
            return;
        }
        else
        {
             NSLog(@"%@",requestStr);
            block(requestStr);
        }
    }];

    
}

- (void)Login:(UIView *)SelfView :(NSMutableDictionary *)dic :(void(^)(id requsetStr))block{
    
    //接口名
    NSString *str = @"/user/login";
    //Url
    NSString *url = [NSString stringWithFormat:@"%@%@",NewReleaseURL,str];
  
    //数据请求
    [HttpsRequest getInstance].selfView = SelfView;
    [[HttpsRequest getInstance] PostData:dic :url andBlock:^(id requestStr) {
        if ([[NSString stringWithFormat:@"%@",requestStr] isEqualToString:@"error"] || [[NSString stringWithFormat:@"%@",requestStr] isEqualToString:@"0"] ) {
            block(0);
            return;
        }
        else if([[NSString stringWithFormat:@"%@",requestStr] isEqualToString:@"1024"])
        {
            block(@"1024");
            return;
        }
        else if([[NSString stringWithFormat:@"%@",requestStr] isEqualToString:@"2048"])
        {
            block(@"2048");
            return;
        }
        else
        {
            NSLog(@"%@",requestStr);
            block(requestStr);
        }
    }];
    
}
@end

下面是具体的使用方法
Viewcontroller.m里面具体使用

#import "Server0.h"

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    
    //登录
    NSMutableDictionary *dic = [[NSMutableDictionary alloc]init];
    [dic setObject:@"123456789" forKey:@"mobile"];
    [dic setObject:@"123456" forKey:@"captcha"];
    [self getLogin:dic];
    
    //注册
    NSMutableDictionary *dic = [[NSMutableDictionary alloc]init];
    [dic setObject:@"123456" forKey:@"mobile"];
    [dic setObject:@"123" forKey:@"captcha"];
    [dic setObject:@"123455"forKey:@"referrerMobile"];
    [self getRegister:dic];
    NSLog(@"%@ %@",phone,verCode);
    
  
}


- (void)getLogin:(NSMutableDictionary *)dic{
    
    [[Server0 getInstance] Login:self.view :dic :^(id requsetStr) {
        if (requsetStr == 0)
        {
            
        }
        else
        {
            
            NSLog(@"%@",requsetStr);

            [UICKeyChainStore setString:[NSString stringWithFormat:@"%@",requsetStr[@"flag"]] forKey:@"flag" service:keychainValue];
            [UICKeyChainStore setData:requsetStr[@"pages"] forKey:@"pages" service:keychainValue];
            [UICKeyChainStore setString:[NSString stringWithFormat:@"%@",requsetStr[@"sessionID"]] forKey:@"sessionID" service:keychainValue];
            [UICKeyChainStore setString:@"LoginSucceed" forKey:@"Login" service:keychainValue];

        }
    }];
}

- (void)getRegister:(NSMutableDictionary *)dic{
        //dic为入参的参数结构体
        
        [[Server0 getInstance] Register:self.view :dic :^(id requsetStr) {
            if (requsetStr == 0)
            {
                
            }
            else
            {
                
                NSLog(@"%@",requsetStr);
                [UICKeyChainStore setString:[NSString stringWithFormat:@"%@",requsetStr[@"flag"]] forKey:@"flag" service:keychainValue];
                [UICKeyChainStore setData:requsetStr[@"pages"] forKey:@"pages" service:keychainValue];
                [UICKeyChainStore setString:[NSString stringWithFormat:@"%@",requsetStr[@"sessionID"]] forKey:@"sessionID" service:keychainValue];
                [UICKeyChainStore setString:@"LoginSucceed" forKey:@"Login" service:keychainValue];

            }
        }];
}


这里我只列出了几个常用的方法,具体数据处理还要看自己对应的需求
requsetStr我自己做了一点处理 请求数据返回的数据里面如果有data为key的数据,会自动解析返回data对应的value值,所以requsetStr不同的接口返回的可能是字典也可能是数组!
如果大家有什么看不明白的地方可以留言给我!空一点我会写一个demo放到我的github上去!可能会更详细!

感谢大家的支持,我会继续努力为大家带来更多更好的开发上面的分享!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容