74-Swift之Alamofire的基本使用和介紹(GET/POST)

前言

本篇是介紹Alamofire 的基本使用闸衫,對(duì)于還不會(huì)引入Alamofire的小伙伴可以看《73-Swift之Pods(CocoaPods)的Alamofire的引入的詳細(xì)指導(dǎo)》勤揩。

Alamofire 是啥并级?

Alamofire是自2014年Swift 推出之后,AFNetworking的作者 [Mattt Thompson] 便提交了一個(gè)新的類似于AFNetworking 的網(wǎng)絡(luò)基礎(chǔ)框架肆氓,并且是專門使用最新的Swift 語(yǔ)言來(lái)編寫(xiě)的省店,其名為:Alamofire

Alamofire 的優(yōu)點(diǎn)

  • 鏈?zhǔn)降恼?qǐng)求/響應(yīng)方法(GET&POST等)
  • URLEncoding / JSONEncoding / PropertyListEncoding 參數(shù)編碼
  • 上傳類型支持:文件(File )智玻、數(shù)據(jù)(Data )、流(Stream)以及MultipartFormData
  • 支持文件下載芙代,下載支持?jǐn)帱c(diǎn)續(xù)傳
  • 支持使用NSURLCredential進(jìn)行身份驗(yàn)證
  • HTTP響應(yīng)驗(yàn)證validate()

Alamofire 對(duì)請(qǐng)求結(jié)果的解析方法提供如下

  • response 以請(qǐng)求DefaultDataResponse的對(duì)象返回請(qǐng)求結(jié)果。

  • responseData 這是將請(qǐng)求的結(jié)果以二進(jìn)制流的形式解析盖彭。

  • responseJSON 這是將請(qǐng)求的結(jié)果以JSON的形式解析纹烹。

  • responseString 這是將請(qǐng)求的結(jié)果以字符串的形式解析。

  • responsePropertyList 這是將請(qǐng)求的結(jié)果以PLIST形式解析召边。

Alamofire 的GET請(qǐng)求方法和請(qǐng)求解析方法的介紹和使用

1铺呵、 無(wú)參數(shù)的Alamofire 的GET請(qǐng)求和解析方式的介紹

// MARK: Alamofire 的Get請(qǐng)求
func alamofireGet1() -> Void {
    /**
       該請(qǐng)求只有一個(gè)參數(shù) 'URLRequest',并返回請(qǐng)求對(duì)象(DataRequest)隧熙。我們可以處理請(qǐng)求對(duì)象(DataRequest)獲取我們需要的數(shù)據(jù)片挂。
     */
    let dataRequest:DataRequest = Alamofire.request("http://www.reibang.com/u/23dd8d9701bf")
    
    // 輸出請(qǐng)求返回的對(duì)象
    print(dataRequest)
    /**
     輸出結(jié)果
     GET http://www.reibang.com/u/23dd8d9701bf
     */
    
    // 解析請(qǐng)求的對(duì)象
    dataRequest.response { (DDResponse) in
        // 獲取請(qǐng)求的狀態(tài)碼
        let stateCode = DDResponse.response?.statusCode
        print(stateCode!)
        
        // 獲取請(qǐng)求的數(shù)據(jù)
        print(DDResponse.data!)// 只輸出數(shù)據(jù)有多少字節(jié)數(shù)
        // 將數(shù)據(jù)轉(zhuǎn)化為字符串
        let dataStr = String.init(data: DDResponse.data!, encoding:String.Encoding.utf8)
        print(dataStr!)
        
        // TODO: 輸出請(qǐng)求對(duì)象
        let requestSwf = DDResponse.request
        print(requestSwf!)
        /*通過(guò)請(qǐng)求對(duì)象,我們可以獲取請(qǐng)求的一系列信息*/
        // 請(qǐng)求頭文件
        print(requestSwf?.allHTTPHeaderFields as Any)
        // 獲取請(qǐng)求的緩存規(guī)則
        print(requestSwf?.cachePolicy as Any)
        // 獲取請(qǐng)求體(body)
        print(requestSwf?.httpBody as Any)
        // 獲取請(qǐng)求的方法
        print(requestSwf?.httpMethod as Any)
        
        
        // TODO: 輸出請(qǐng)求響應(yīng)對(duì)象
        let responseSwf = DDResponse.response
        print(responseSwf!)
        /**
         輸出響應(yīng)對(duì)象:
         <NSHTTPURLResponse: 0x608000221020> { URL: http://www.reibang.com/u/23dd8d9701bf } { status code: 200, headers {
         "Cache-Control" = "max-age=0, private, must-revalidate";
         Connection = "keep-alive";
         "Content-Encoding" = gzip;
         "Content-Type" = "text/html; charset=utf-8";
         Date = "Sat, 30 Sep 2017 06:43:45 GMT";
         Etag = "W/\"663fd325a56556576a8facd92d50bedd\"";
         Server = Tengine;
         "Set-Cookie" = "_maleskine_session=Y1JTZ2xhYnZ6b3dMZnZaZmVQeHZqVFN5L2QyWDJmaURtcVVBNXFGSXhRWlMvTUxzUWRhTkRFdy83NVAzbW0yNHhqQ05KNkN1WFJTTURTSkNYVnkzYmV6Wm96bmZyVU1kY0VQK3l6bENwN1JUVmdEaGtVY2NBUEdjbzBCZjAvdGVDTWRvRkhlZG16c2tjOGUzSnRvTVVBQWNNYUZyazhNRXlWellNeFFnNHFISTZMQ213bzFKNzV5OEdkYjF5VGRKbE9HdUJtWGpqV0VKU1RNcVJ3TktnMEFjclhFdFRtS3dKYngzek9pM2dWbGcyMmtQc0dLRU1RbDk2bUN2WW9jd3N3OWNMeFFqRkMrK08vYU5aWklEakxIanc2T1k3WjNsbFB1OVF4Rmd1VFZ0b1p2SFZnQ3l0WVVmZFM1KzZ4YmEzNTFhcjhVNHE5K0dacDlsM3RtMDBRPT0tLWxWaTQwNGpwVmZVaHdjNnc3Rk9teUE9PQ%3D%3D--a78f5fd47ad6bf048e57fd6701649281b26b2c63; path=/; HttpOnly";
         "Transfer-Encoding" = Identity;
         "X-Content-Type-Options" = nosniff;
         "X-Frame-Options" = DENY;
         "X-Request-Id" = "33b02181-e572-423c-ac45-a373e55edd6b";
         "X-Runtime" = "0.078608";
         "X-Via" = "1.1 wdx18:10 (Cdn Cache Server V2.0)";
         "X-XSS-Protection" = "1; mode=block";
         } }
         */
        
        // TODO: 輸出請(qǐng)求的錯(cuò)誤信息
        print(DDResponse.error as Any)
        
        // TODO: 獲取請(qǐng)求/響應(yīng)統(tǒng)計(jì)信息的任務(wù)指標(biāo)贞盯。
        print(DDResponse.metrics!)
    }
    
    // TODO: 以二進(jìn)制數(shù)據(jù)形式輸出請(qǐng)求結(jié)果(也可以說(shuō)解析請(qǐng)求結(jié)果)
    dataRequest.responseData { (data) in
         print(data)
         /*輸出:SUCCESS: 24039 bytes */
    }
    
    //TODO: 以JSON形式的輸出請(qǐng)求數(shù)據(jù)(以JOSN形式解析結(jié)果)
    dataRequest.responseJSON { (dataResponse) in
        // 輸出一個(gè) 'DataResponse' 的對(duì)象
        print(dataResponse)
        
        // 通過(guò)‘DataResponse’ 我們可以獲取一些信息
        // 1.請(qǐng)求的連接
        print(dataResponse.request!)
        
        // 2. 請(qǐng)求響應(yīng)的對(duì)象
        print(dataResponse.response!)
        
        // 3. 請(qǐng)求返回的數(shù)據(jù)
        print(dataResponse.data!)
        
        // 4. 服務(wù)器返回的結(jié)果
        print(dataResponse.result)
        
        // 5.完成請(qǐng)求需要的時(shí)間
        print(dataResponse.timeline)
    }
    
    //TODO: 將返回?cái)?shù)據(jù)以字符串的形式解析
    dataRequest.responseString { (dataResponse) in
        // 輸出一個(gè) 'DataResponse' 的對(duì)象
        print(dataResponse)
        
        // 通過(guò)‘DataResponse’ 我們可以獲取一些信息
        // 1.請(qǐng)求的連接
        print(dataResponse.request!)
        
        // 2. 請(qǐng)求響應(yīng)的對(duì)象
        print(dataResponse.response!)
        
        // 3. 請(qǐng)求返回的數(shù)據(jù)
        print(dataResponse.data!)
        
        // 4. 服務(wù)器返回的結(jié)果
        print(dataResponse.result)
        
        // 5.完成請(qǐng)求需要的時(shí)間
        print(dataResponse.timeline)
    }
    
    //TODO: 將數(shù)據(jù)以PLIST文件形式輸出
    dataRequest.responsePropertyList { (dataResponse) in
        // 輸出一個(gè) 'DataResponse' 的對(duì)象
        print(dataResponse)
        
        // 通過(guò)‘DataResponse’ 我們可以獲取一些信息
        // 1.請(qǐng)求的連接
        print(dataResponse.request!)
        
        // 2. 請(qǐng)求響應(yīng)的對(duì)象
        print(dataResponse.response!)
        
        // 3. 請(qǐng)求返回的數(shù)據(jù)
        print(dataResponse.data!)
        
        // 4. 服務(wù)器返回的結(jié)果
        print(dataResponse.result)
        
        // 5.完成請(qǐng)求需要的時(shí)間
        print(dataResponse.timeline)
    }
    
    //TODO: 在線程中處理請(qǐng)求的數(shù)據(jù)
    let dispathQu = DispatchQueue.main
    dataRequest.response(queue: dispathQu) { (ddataResponse) in
        // 返回一個(gè)‘DefaultDataResponse’ 對(duì)象
        print(ddataResponse)
        
        // 1音念、獲取請(qǐng)求體
        print(ddataResponse.request!)
        
        // 2、獲取請(qǐng)求響應(yīng)體
        print(ddataResponse.response!)
        
        // 3躏敢、獲取請(qǐng)求數(shù)據(jù)
        print(ddataResponse.data!)
        
        // 4闷愤、獲取請(qǐng)求的錯(cuò)誤信息
        print(ddataResponse.error!)
    }
    
    // 請(qǐng)求的進(jìn)度
    print(dataRequest.progress)
}

2、Alamofire的帶參數(shù)的GET請(qǐng)求

// TODO: Alamofire的GET請(qǐng)求帶參數(shù)
func alamofireGet2() -> Void {
    let dataResponse = Alamofire.request("http://gc.ditu.aliyun.com/geocoding",parameters:["a":"北京"])
    // 請(qǐng)求返回的結(jié)果
    print(dataResponse)
    
    // 對(duì)請(qǐng)求的結(jié)果處理
    dataResponse.responseData { (dataRequ) in
        if let data = dataRequ.data {
            let strData = String.init(data: data, encoding: String.Encoding.utf8)
            print(strData!)
            /**
             輸出的結(jié)果:
             {"lon":116.40752,"level":1,"address":"","cityName":"","alevel":4,"lat":39.90403}
             */
        }
    }
}

3件余、Alamofire的GET請(qǐng)求和返回?cái)?shù)據(jù)一起處理的寫(xiě)法

// TODO: Alamofire的GET請(qǐng)求和返回?cái)?shù)據(jù)一起處理的寫(xiě)法
func alamofireGet3() -> Void {
    Alamofire.request("http://gc.ditu.aliyun.com/geocoding",parameters:["a":"北京"]).responseString { (dataResquest) in
        if let data = dataResquest.data {
            let strData = String.init(data: data, encoding: String.Encoding.utf8)
            print(strData!)
            /**
             輸出的結(jié)果:
             {"lon":116.40752,"level":1,"address":"","cityName":"","alevel":4,"lat":39.90403}
             */
        }
    }
}

Alamofire 的POST請(qǐng)求

// MARK: Alamofire的POST請(qǐng)求
func alamofirePost() -> Void {
    Alamofire.request("http://gc.ditu.aliyun.com/geocoding",method:.post ,parameters:["a":"北京"]).responseJSON { (dataRequest) in
        if let data = dataRequest.data {
            let strData = String.init(data: data, encoding: String.Encoding.utf8)
            print(strData!)
            /**
             輸出的結(jié)果:
             {"lon":116.40752,"level":1,"address":"","cityName":"","alevel":4,"lat":39.90403}
             */
        }
    }
}

POST 和 GET 的友情快遞

對(duì)于POST 和 GET的區(qū)別是:GET產(chǎn)生一個(gè)TCP數(shù)據(jù)包讥脐;POST產(chǎn)生兩個(gè)TCP數(shù)據(jù)包遭居。對(duì)于GET方式的請(qǐng)求,瀏覽器會(huì)把http header和data一并發(fā)送出去旬渠,服務(wù)器響應(yīng)200(返回?cái)?shù)據(jù))俱萍; 而對(duì)于POST,瀏覽器先發(fā)送header告丢,服務(wù)器響應(yīng)100 continue枪蘑,瀏覽器再發(fā)送data,服務(wù)器響應(yīng)200 (返回?cái)?shù)據(jù))芋齿。

Alamofire 可以自定義請(qǐng)求

1腥寇、只定義請(qǐng)求方式的請(qǐng)求

// MARk:自定義請(qǐng)求
func customRequestMethod() -> Void {
    // 創(chuàng)建請(qǐng)求體
    let urlRequest = try! URLRequest.init(url: "http://www.reibang.com/u/23dd8d9701bf", method: .get)
    Alamofire.request(urlRequest).responseString { (dataRequest) in
         print(dataRequest.data!)
    }
}
method 可選參數(shù)如下:
public enum HTTPMethod: String {
    case options = "OPTIONS"
    case get     = "GET"
    case head    = "HEAD"
    case post    = "POST"
    case put     = "PUT"
    case patch   = "PATCH"
    case delete  = "DELETE"
    case trace   = "TRACE"
    case connect = "CONNECT"
}

2、可是設(shè)置請(qǐng)求的緩存策略和請(qǐng)求超時(shí)的時(shí)間的請(qǐng)求

// MARK: 可是設(shè)置請(qǐng)求的緩存策略和請(qǐng)求超時(shí)的時(shí)間
func customRequestMethod1() -> Void {
    // 創(chuàng)建請(qǐng)求體
    let urlRequest =  URLRequest.init(url: URL.init(string: "http://www.reibang.com/u/23dd8d9701bf")!, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 30)
    Alamofire.request(urlRequest).responseData { (dataQuest) in
         print(dataQuest.data!)
    }
}

@ cachePolicy 是請(qǐng)求緩存策略參數(shù)
@ timeoutInterval 是請(qǐng)求超時(shí)時(shí)間參數(shù)

3觅捆、可設(shè)置請(qǐng)求方式和請(qǐng)求頭的請(qǐng)求

// MARK: 可設(shè)置請(qǐng)求方式和請(qǐng)求頭的請(qǐng)求
func customRequestMethod2() -> Void {
    // 創(chuàng)建請(qǐng)求體
    let urlRequest = try! URLRequest.init(url: "http://www.reibang.com/u/23dd8d9701bf", method: .get, headers:["charset":"utf-8","Content-Type":"application/x-www-form-urlencoded","appKey":"NetWork小賤"])
    Alamofire.request(urlRequest).responseData { (dataRequest) in
         print(dataRequest.data!)
    }
}

@ method 設(shè)置請(qǐng)求方式
@ headers 設(shè)置請(qǐng)求頭

Alamofire 的上傳參數(shù)編碼的請(qǐng)求

Alamofire 的請(qǐng)求參數(shù)編碼有以下幾種:

  • 1赦役、 URLEncoding 是 “URL” 網(wǎng)址編碼規(guī)則

  • 2、 JSONEncoding 是 “JSON” 格式編碼規(guī)則

  • 3栅炒、 PropertyListEncoding 是 “PLIST” 文件編碼規(guī)則

使用舉例如下:

//MARK: 上傳參數(shù)使用指定的編碼格式上傳的請(qǐng)求
func parameterCodingRequest() -> Void {
     // 請(qǐng)求的參數(shù)
    let parameter = ["type":"hot","offset":"0","limit":"10"]
    /**
     參數(shù)的所有編碼形式如下,即 “ParameterEncoding” 的擴(kuò)展對(duì)象:
     1掂摔、 URLEncoding  是 “URL” 網(wǎng)址編碼規(guī)則
     2、 JSONEncoding 是 “JSON” 格式編碼規(guī)則
     3赢赊、 PropertyListEncoding 是 “PLIST” 文件編碼規(guī)則
     */
    Alamofire.request("http://m.maoyan.com/movie/list.json", method: .get, parameters: parameter,
                      encoding: URLEncoding.default).responseJSON { (dataRequest) in
                        if let data = dataRequest.data {
                            print(String.init(data: data, encoding: String.Encoding.utf8)!)
                        }
    }
}

Alamofire 的 validate() 函數(shù)的介紹

1乙漓、 validate() 函數(shù)是啥?

確認(rèn)響應(yīng)有默認(rèn)可接受的200~299范圍內(nèi)的狀態(tài)碼释移,還有內(nèi)容類型匹配在Accept HTTP頭字段中指定的任何值叭披。如果驗(yàn)證失敗,隨后對(duì)響應(yīng)處理程序的調(diào)用將會(huì)有一個(gè)相關(guān)的錯(cuò)誤玩讳。

2涩蜘、請(qǐng)求信息的驗(yàn)證之 “validate”

// MARK: 請(qǐng)求信息的驗(yàn)證之 “validate”
func verifyInformationRequest() -> Void {
    Alamofire.request("http://m.maoyan.com/cinemas.json").validate().responseJSON { (dataRequest) in
        switch dataRequest.result.isSuccess {
        case true:
            let data  = dataRequest.data
            let dict = try! JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers)
            print(dict)
        case false:
            print("獲取信息失敗Q俊同诫!")
        }
    }
}

3、驗(yàn)證請(qǐng)求狀態(tài)碼在 “200~299” 之間的請(qǐng)求樟澜,否則误窖,不驗(yàn)證。

// MARK: 驗(yàn)證請(qǐng)求狀態(tài)碼在 “200~299” 之間的請(qǐng)求秩贰,否則霹俺,不驗(yàn)證。
func requestStateCodeVerification() -> Void {
    Alamofire.request("http://m.maoyan.com/cinemas.json").validate(statusCode: [200,299]).responseJSON { (dataRequest) in
        switch dataRequest.result.isSuccess {
        case true:
            if let data = dataRequest.data {
                let dict = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers)
                print(dict)
            }
        case false:
            print("獲取信息失敹痉选?苑!蝗罗!")
        }
    }
}

4艇棕、驗(yàn)證指定請(qǐng)求媒體信息格式的請(qǐng)求

// MARK: 驗(yàn)證指定請(qǐng)求媒體信息格式的請(qǐng)求
func verifyRequestMediaFormatRequest() -> Void {
    /**
     友情大爆炸:
     1蝌戒、contentType : 即是 “Internet Media Type” 稱之為 互聯(lián)網(wǎng)媒體類型,也叫 “MIME”沼琉。作用是在 "HTTP" 請(qǐng)求頭中使用“contentType”來(lái)指定不同格式的請(qǐng)求信息北苟。
     
     2、contentType 常見(jiàn)的媒體格式類型如下:
     text/html  :HTML格式
     text/plain :純文本格式
     text/xml   :XML格式
     image/gif  :gif圖片格式
     image/jpeg :jpg圖片格式
     image/png  :png圖片格式
     以application開(kāi)頭的媒體格式類型:
     application/xhtml+xml :XHTML格式
     application/xml       :XML數(shù)據(jù)格式
     application/atom+xml  :Atom XML聚合格式
     application/json      :JSON數(shù)據(jù)格式
     application/pdf       :pdf格式
     application/msword    :Word文檔格式
     application/octet-stream :二進(jìn)制流數(shù)據(jù)(如常見(jiàn)的文件下載)
     application/x-www-form-urlencoded :<form encType=””>中默認(rèn)的encType打瘪,form表單數(shù)據(jù)被編碼為key/value格式發(fā)送到服務(wù)器(表單默認(rèn)的提交數(shù)據(jù)的格式)
     */
    Alamofire.request("http://m.maoyan.com/cinemas.json").validate(contentType: ["text/html","text/plain","application/json"]).responseJSON { (dataRequest) in
        switch dataRequest.result.isSuccess {
        case true:
            if let data = dataRequest.data {
                let dict = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers)
                print(dict)
            }
        case false:
            print("獲取信息失斢驯恰!9肷А彩扔!")
        }
    }
}

5、我們可以根據(jù)某個(gè)條件僻爽,來(lái)設(shè)定返回的驗(yàn)證結(jié)果 “ValidationResult”

// MARK: 我們可以根據(jù)某個(gè)條件虫碉,來(lái)設(shè)定返回的驗(yàn)證結(jié)果 “ValidationResult”
func customizationValidationResult() -> Void {
    Alamofire.request("http://m.maoyan.com/cinemas.json").validate { (urlRequest, httpUrlResponse, data) -> Request.ValidationResult in
        // 在這里我們可以提前檢驗(yàn) 請(qǐng)求的 “URLRequest”、“HTTPURLResponse” 和 返回的數(shù)據(jù) “Data” 等來(lái)設(shè)置請(qǐng)求返回的 “ValidationResult”
        if !(urlRequest?.url?.absoluteString.contains("NetWork"))! {
            let error = NSError.init(domain: "m.maoyan.com", code: 320, userInfo: ["msg":"請(qǐng)求不包含指定的參數(shù)"]) as Error
            return Request.ValidationResult.failure(error)
        }
        return Request.ValidationResult.success
        }.responseJSON { (dataRequest) in
            switch dataRequest.result.isSuccess {
            case true:
                if let data = dataRequest.data {
                    let dict = try! JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers)
                    print(dict)
                }
            case false:
                let errorInfo = dataRequest.result.error! as NSError
                print(errorInfo.userInfo)
                /**
                 輸出信息:["msg": "請(qǐng)求不包含指定的參數(shù)"]
                 */
            }
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胸梆,一起剝皮案震驚了整個(gè)濱河市敦捧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碰镜,老刑警劉巖兢卵,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異绪颖,居然都是意外死亡秽荤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門柠横,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)窃款,“玉大人,你說(shuō)我怎么就攤上這事滓鸠。” “怎么了第喳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵糜俗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我曲饱,道長(zhǎng)悠抹,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任扩淀,我火速辦了婚禮楔敌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘驻谆。我一直安慰自己卵凑,他們只是感情好庆聘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著勺卢,像睡著了一般伙判。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上黑忱,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天宴抚,我揣著相機(jī)與錄音,去河邊找鬼甫煞。 笑死菇曲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抚吠。 我是一名探鬼主播常潮,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼埃跷!你這毒婦竟也來(lái)了蕊玷?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤弥雹,失蹤者是張志新(化名)和其女友劉穎垃帅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體剪勿,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贸诚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了厕吉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酱固。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖头朱,靈堂內(nèi)的尸體忽然破棺而出运悲,到底是詐尸還是另有隱情,我是刑警寧澤项钮,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布班眯,位于F島的核電站,受9級(jí)特大地震影響烁巫,放射性物質(zhì)發(fā)生泄漏署隘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一亚隙、第九天 我趴在偏房一處隱蔽的房頂上張望磁餐。 院中可真熱鬧,春花似錦阿弃、人聲如沸诊霹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)畅哑。三九已至肴楷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間荠呐,已是汗流浹背赛蔫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泥张,地道東北人呵恢。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像媚创,于是被迫代替她去往敵國(guó)和親渗钉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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