Jmeter使用基礎

一. 性能測試

1.0 為什么要進行性能測試?

  1. 評估當前系統的能力
  2. 尋找性能瓶頸,優化系統性能
  3. 評估軟件是否滿足未來的需要
  4. 招聘需要

1.1 什么是性能

時間:系統處理用戶請求的響應時間
資源:系統運行過程中,系統資源的消耗情況

1.2. 性能測試是什么

1.2.1 廣義定義

基于協議模擬用戶發出請求,對服務器形成一定負載,來測試服務器的性能指標是否滿足要求性能指標關注點:時間性能、空間性能性能測試與頁面無關

1.2.1 狹義定義

指通過自動化的測試工具模擬多種正常、峰值以及異常負載條件來對系統的各項性能指標進行測試。

1.3 功能和性能測試

  1. 不同
    功能測試驗證系統的功能需求規格,聚焦功能。
    性能測試驗證系統的業務性需求場景,聚焦時間和資源。
  2. 關系
    一般項目中,先功能測試通過后,后進行性能測試。

1.4 性能測試的分類

1.4.1 基準測試

狹義:單用戶測試
廣義:建立基準線,當系統軟硬件環境發生變化之后再進行一次基準測試以確定變化對性能的影響。

1.4.2 負載測試

  1. 概念
    通過逐步增加系統負載,確定在滿足性能指標的情況下,找出系統所能承受最大負載量的測試。

  2. 作用
    系統最大負載量達到用戶要求時,系統才能正式上線使用。

  3. 案例
    電梯行業規范:電梯從1樓到5樓的運行時間不超過24s

    1人    20s
    7人    20s
    13人   20s    達到最大負載
    16人   25s
    19人   28s
    21人   斷繩子
    
    
  4. 注意
    通過負載測試,可以確定系統的最大負載量和極限負載量
    系統對外宣稱的最大負載量
    負載測試的時間一般為1-2小時

1.4.3 穩定性測試

  1. 概念:在服務器穩定運行(用戶正常業務負載下)的情況進行長時間測試(1天-一周等),并最終保證服務器能滿足線上業務需求。
  2. 系統在用戶需求的業務負載下運行達到規定的時間時,系統才能正式上線使用。

1.4.4 壓力測試

  1. 概念:在強負載下的測試,查看系統在峰值下是否功能隱患、系統是否具有良好的容錯能力和可恢復的能力。
  2. 測試場景
    高負載下的長時間穩定性壓力測試 (如:B-C區間內進行24/3*24小時長時間測試)
    極限負載下的破壞性壓力測試(如:C-D區間內進行測試)

1.4.5 并發測試

  1. 概念:在極短時間內,發送多個請求,來驗證服務器對并發的處理能力。
  2. 應用場景
    特定的活動場景:搶紅包、秒殺、搶購等。
  3. 與負載測試對比:
    負載測試:主要目的是測試高負載情況下,對系統資源的消耗,是否會耗盡的問題(雙11活動)
    并發測試:主要目的是測試極短時間內,并發請求時,系統資源爭搶的問題(搶紅包、秒殺)

1.5 性能測試的指標

1.5.1 響應時間

  1. 指從客戶端發起請求開始,到客戶端接收到結果的總時間
  2. 包括:服務器處理時間 + 網絡傳輸時間

1.5.2 并發用戶數

某一時刻同時向服務器發送請求的用戶數

1.5.3 吞吐量(Throughout)

1.概念:單位時間內處理客戶端的請求數量,直接體現軟件系統能能承載能力。

  1. 吞吐量單位分類

1.5.4 QPS

QPS(Query Per Second)每秒查詢數,即控制服務器每秒處理的指定請求的數量。

1.5.5 TPS

TPS(Transaction Per Second)每秒事務數,即控制服務器每秒處理事務請求的數量。
如:支付請求事務=查詢用戶余額請求+校驗支付安全請求+發送支付請求
每秒處理查詢用戶余額15請求,每秒處理校驗支付安全15個請求,每秒處理發送支付15個請求
支付tsp為15

1.5.6 點擊數

所有的頁面元素(如:圖片、鏈接、框架等)的請求總數

  • 注意:
  • 點擊數是請求數,不是頁面上的一次點擊

1.5.7 錯誤率

  • 指系統在負載情況下,失敗業務的概率
  • 注意:
  • 錯誤率是性能指標,是高負載下的失敗業務的概率
    -隨機bug是功能bug,先解決隨機bug才能進行性能測試

1.5.8 資源利用率

  1. 概念:系統各種資源的使用情況,率=資源使用量/總資源可用量x100%
  2. 常見資源指標
    CPU使用率:不高于75%-85%
    內存大小使用率:不高于80%
    磁盤IO(速率):不高于90%
    網路(速率):不高于80%

1.6 性能測試工具

image

二. Jmeter簡介

2.1. 我們為什么使用Jmeter

開源,免費,基于Java編寫,可集成到其他系統可拓展各個功能插件
支持接口測試,壓力(負載和壓力)測試等多種功能,支持錄制回放,
入門簡單相較于自己編寫框架活其他開源工具,有較為完善的UI界面,便于接口調試
多平臺支持,可在Linux,Windows,Mac上運行,支持多協議

2.2. Jmeter的作用

  1. 接口測試 面試說postman,因為方便好用。
  2. 性能測試 jmeter,也可以用postman(runner),但是沒有性能指標
  3. 數據庫測試

2.3. Jmeter怎么用

Windows下Jmeter下載安裝,登錄 http://jmeter.apache.org/download_jmeter.cgi ,根據自己平臺,下載對應文件

image

2.4. 安裝JAVA環境

安裝JDK,配置環境變量(具體步驟不做介紹)

image

將下載Jmeter文件解壓,打開/bin/jmeter.bat

image
image

2.5. Jmeter的目錄結構

image

/bin 目錄常用文件介紹:

examples:目錄下包含Jmeter使用實例
ApacheJMeter.jar:JMeter源碼包
jmeter.bat:windows下啟動文件
jmeter.sh:Linux下啟動文件
jmeter.log:Jmeter運行日志文件
jmeter.properties:Jmeter配置文件
jmeter-server.bat:windows下啟動負載生成器服務文件
jmeter-server:Linux下啟動負載生成器文件
/docs目錄——Jmeter幫助文檔
/extras目錄——提供了對Ant的支持文件,可也用于持續集成
/lib目錄——存放Jmeter依賴的jar包,同時安裝插件也放于此目錄
/licenses目錄——軟件許可文件,不用管
/printable_docs目錄——Jmeter用戶手冊

三. 使用Jmeter測試快速入門

3.1. 線程組是什么

進程: 一個正在執行的程序對應一個進程
線程: 一個進程有多個執行線程
線程組:   按照線程性質對線程分組。查看任務管理器(愛奇藝有多個)
三者關系: 一個進程有多個線程組,一個線程組有多個線程

測試計劃—線程組—線程組屬性中的線程數
并發執行:多個線程同時執行,特點:執行結束的順序與開始的順序不一致
順序執行:按照線程的啟動順序挨個執行
默認情況下,線程組中的線程是并發執行
每一個線程都要執行組內的http請求
設置線程組順序執行:勾選測試計劃中的(獨立運行每個線程組)
線程組用來模擬用戶的并發訪問

3.1.1. 創建線程組

image

3.1.2. 線程組主要包含三個參數:

線程數、準備時長(Ramp-Up Period(in seconds))、循環次數。

3.1.3. 線程數:

虛擬用戶數。一個虛擬用戶占用一個線程。設置多少虛擬用戶數在這里也就是設置多少個線程數。

3.1.4. 準備時長(秒):

設置的虛擬用戶數需要多長時間全部啟動。如果線程數為20 ,準備時長為10 ,那么需要10秒鐘啟動20個線程。也就是每秒鐘啟動2個線程。

3.1.5. 循環次數:

每個線程發送請求的次數。如果線程數為20 ,循環次數為100 ,那么每個線程發送100次請求。總請求數為20*100=2000 。如果勾選了“永遠”,那么所有線程會一直發送請求,一直到選擇停止運行腳本。

3.1.6. 調度器

設置線程組啟動的開始時間和結束時間(配置調度器時,需要勾選循環次數為永遠)

3.1.7. 持續時間(秒)

測試持續時間,會覆蓋結束時間

3.1.8. 啟動延遲(秒)

測試延遲啟動時間,會覆蓋啟動時間

3.1.9. 啟動時間

測試啟動時間,啟動延遲會覆蓋它。當啟動時間已過,手動只需測試時當前時間也會覆蓋它。

3.1.10. 結束時間

測試結束時間,持續時間會覆蓋它。

image

3.2. 創建http請求

見得最多,所以我們著重講解:

image

3.3. 指定請求域名,請求路徑

接口文檔講解

image
一個HTTP請求有著許多的配置參數,下面將詳細介紹:
名稱:本屬性用于標識一個取樣器,建議使用一個有意義的名稱。
注釋:對于測試沒有任何作用,僅用戶記錄用戶可讀的注釋信息。
服務器名稱或IP :HTTP請求發送的目標服務器名稱或IP地址。
端口號:目標服務器的端口號。
方法:發送HTTP請求的方法,可用方法包括GET、POST、HEAD、PUT、OPTIONS、TRACE、DELETE等。
Content encoding :內容的編碼方式,默認值為iso8859
路徑:目標URL路徑(不包括服務器地址和端口)

點擊run測試,很麻煩,我們使用postman測試更簡單,使用postman操作。
可以使用剛才的接口文檔中的,聚合接口中演示一個。

3.4. 設置對應的查看內容

image

注意:如果監聽器中有jp@gc開頭的,都是第三方插件

3.5. 查看表格信息

image
Sample:每個請求的序號
Start Time:每個請求開始時間
Thread Name:每個線程的名稱
Label:Http請求名稱
Sample Time:每個請求所花時間,單位毫秒
Status:請求狀態,如果為勾則表示成功,如果為叉表示失敗。
Bytes:請求的字節數
樣本數目:也就是上面所說的請求個數,成功的情況下等于你設定的并發數目乘以循環次數
平均:每個線程請求的平均時間
最新樣本:表示服務器響應最后一個請求的時間
偏離:服務器響應時間變化、離散程度測量值的大小,或者,換句話說,就是數據的分布。

3.6. 查看結果樹

  • 請求的數據展示(請求頭信息,請求參數,,)

    image
  • 響應的數據展示(響應碼,響應頭,,)

    image

    通過察看結果樹,我們可以看到每個請求的結果,其中紅色的是出錯的請求,綠色的為通過。

Thread Name:線程組名稱
Sample Start: 啟動開始時間
Load time:加載時長
Latency:等待時長
Size in bytes:發送的數據總大小
Headers size in bytes:發送數據的其余部分大小
Sample Count:發送統計
Error Count:交互錯誤統計
Response code:返回碼
Response message:返回信息
Response headers:返回的頭部信息

3.7. 聚合報告參數說明

image
lable:對應每一個http請求,顯示的是http請求的Name,如百度http請求name為baidu
#Samples:表示這一次的測試中一共發出了多少請求,如上圖所示,sougou和baidu的http請求每個都發出30個請求
Average:平均響應時間,指的是所有的請求的平均響應時間,如上圖的30個請求的總的響應時間除以30得出的平均響應時間,默認的情況下是單個請求的平均響應時間,但當使用了“事務控制器”時,則以事物為單位顯示平均響應時間
Median:中位數,也就是50%用戶的響應時間
90%Line:90%用戶的響應時間
Min:最小響應時間
Max:最大的響應時間
Error%:本次測試中出現錯誤的請求的數量/請求的總數,如上圖所示,本次的測試中,sougou的http請求66.6%的請求出錯,而baidu的請求則沒有出錯的請求
Throughput:吞吐量,默認情況下表示每秒完成的請求數,如上圖所示,每秒完成的請求數分別為6.6個每秒,6.2個每秒
Recived KB/Sec:每秒從服務器端接收到的數據量,以kb為計算的單位

掌握:平均時間、錯誤率、吞吐量。

3.8. 圖形結果

作用:通過圖形展示出本次性能測試數據的分布。 圖形結果一般作為聚合報告的分析輔佐

image
樣本數目:總共發送到服務器的請求數。
最新樣本:代表時間的數字,是服務器響應最后一個請求的時間。
吞吐量:服務器每分鐘處理的請求數。
平均值:總運行時間除以發送到服務器的請求數。
中間值:有一半的服務器響應時間低于該值而另一半高于該值。
偏離:表示服務器響應時間變化、離散程度測量值的大小。

四. Jmeter主要組件介紹

  1. 測試計劃:使用 JMeter 進行測試的起點,它是其它 JMeter 測試元件的容器。
  2. 線程組:代表一定數量的并發用戶,它可以用來模擬并發用戶發送請求。實際的請求內容在Sampler中定義,它被線程組包含。可以在“測試計劃->添加->線程組”來建立它,然后在線程組面板里有幾個輸入欄:線程數、Ramp-Up Period(in seconds)、循環次數,其中Ramp-Up Period(in seconds)表示在這時間內創建完所有的線程。如有8個線程,Ramp-Up = 200秒,那么線程的啟動時間間隔為200/8=25秒,這樣的好處是:一開始不會對服務器有太大的負載。線程組是為模擬并發負載而設計。
  3. 取樣器(Sampler):模擬各種請求。所有實際的測試任務都由取樣器承擔,存在很多種請求。如:HTTP 、ftp請求等等。
  4. 監聽器:負責收集測試結果,同時也被告知了結果顯示的方式。功能是對取樣器的請求結果顯示、統計一些數據(吞吐量、KB/S……)等。
  5. 斷言:用于來判斷請求響應的結果是否如用戶所期望,是否正確。它可以用來隔離問題域,即在確保功能正確的前提下執行壓力測試。這個限制對于有效的測試是非常有用的。
  6. 邏輯控制器:允許自定義JMeter發送請求的行為邏輯,它與Sampler結合使用可以模擬復雜的請求序列。
  7. 定時器:負責定義請求(線程)之間的延遲間隔,模擬對服務器的連續請求。
  8. 配置元件維護Sampler需要的配置信息,并根據實際的需要會修改請求的內容。
  9. 前置處理器和后置處理器負責在生成請求之前和之后完成工作。前置處理器常常用來修改請求的設置,后置處理器則常常用來處理響應的數據。

4.1. 測試計劃

image
1.測試計劃就是一個完整的場景
2.“獨立運行每個線程組” :勾選以后所有的線程組都是順序執行的了。一般不勾選,讓所有 的線程組并發啟動。
3.“函數測試模式” :勾選后會有詳細的請求記錄,消耗資源,影響客戶端性能。一般不勾選。
4.用戶定義的變量:全局變量,測試計劃上可以添加用戶定義的變量。一般添加一些系統常用的配置。如果測試過程中想切換環境,切換配置,一般不建議在測試計劃上添加變量

image

4.2. 線程組

image

(1)thread group(線程組)

這個就是我們通常添加運行的線程。通俗的講一個線程組,可以看做一個虛擬用戶組,線程組中的每個線程都可以理解為一個虛擬用戶。

(2)setup thread group

一種特殊類型的ThreadGroup的,可用于執行預測試操作。這些線程的行為完全像一個正常的線程組元件。不同的是,這些類型的線程執行測試前進行定期線程組的執行;類似LoadRunner的init,測試開始時進行初始化的工作。

(3)teardown thread group

一種特殊類型的ThreadGroup的,可用于執行測試后動作。這些線程的行為完全像一個正常的線程組元件。不同的是,這些類型的線程執行測試結束后執行定期的線程組;類似LoadRunnner的end,測試結束時進行回收工作。

image

4.3. 取樣器(Http請求)

image

關于http請求的的屬性參數說明:

1)名稱:用于標識一個sample。建議使用一個有意義的名稱
2)注釋:對于測試沒任何影響,僅用來記錄用戶可讀的注釋信息
3)服務器名稱或IP:http請求發送的目標服務器名稱或者IP地址,比如http://www.baidu.com
4)端口號:目標服務器的端口號,默認值為80,可不填
5)協議:向目標服務器發送http請求時的協議,http/https,大小寫不敏感,默認http
6)方法:發送http請求的方法(鏈接:http://www.cnblogs.com/imyalost/p/5630940.html)
7)Content encoding:內容的編碼方式(Content-Type=application/json;charset=utf-8)
8)路徑:目標的URL路徑(不包括服務器地址和端口)
9)自動重定向:如果選中該項,發出的http請求得到響應是301/302,jmeter會重定向到新的界面
10)Use keep Alive:jmeter 和目標服務器之間使用 Keep-Alive方式進行HTTP通信(默認選中)
11)Use multipart/from-data for HTTP POST :當發送HTTP POST 請求時,使用
12)Parameters、Body Data以及Files Upload的區別:
 1. parameter是指函數定義中參數,而argument指的是函數調用時的實際參數
 2. 簡略描述為:parameter=形參(formal parameter), argument=實參(actual parameter)
 3.在不很嚴格的情況下,現在二者可以混用,一般用argument,而parameter則比較少用
  While defining method, variables passed in the method are called parameters.
  當定義方法時,傳遞到方法中的變量稱為參數.
  While using those methods, values passed to those variables are called arguments.
  當調用方法時,傳給變量的值稱為引數.(有時argument被翻譯為“引數“)
 4、Body Data指的是實體數據,就是請求報文里面主體實體的內容,一般我們向服務器發送請求,攜帶的實體主體參數,可以寫入這里
 5、Files Upload指的是:從HTML文件獲取所有有內含的資源:被選中時,發出HTTP請求并獲得響應的HTML文件內容后還對該HTML
   進行Parse 并獲取HTML中包含的所有資源(圖片、flash等):(默認不選中)
   如果用戶只希望獲取特定資源,可以在下方的Embedded URLs must match 文本框中填入需要下載的特定資源表達式,只有能匹配指定正則表達式的URL指向資源會被下載

4.4. 監聽器

監聽器(Listener)負責收集測試結果,同時也被告知了結果顯示的方式。我們常用的包括:聚合報告、查看結果樹、用表格查看結果,都支持將結果數據寫入文件。其他的添加上去看看就行。聚合報告前面我們介紹過,后面是查看結果樹和用表格查看結果的截圖。

image

4.5. 循環控制器

image
image
image

4.6. 事務控制器

作用: 事務控制器會生產一個額外的采樣器,用來統計該控制器子結點的所有時間。
在線程組下創建事務控制器
參數:
· Generate parent sample:(選中這個參數結果展示如下圖紅框,否則顯示為下圖藍框)
· Include duration of timer and pre-post processors in generated sample:選中這一項會統計定時器(timer)的時間,否則只統計采樣器(sample)的時間

image

創建sample 訪問首頁和注冊頁面

image

生成聚合報告

image

勾選

image

聚合報告中只有一項事務報告

image

4.7. 斷言---檢查點

斷言(Assertions)可以用來判斷請求響應的結果是否如用戶所期望的。它可以用來隔離問題域,即在確保功能正確的前提下執行壓力測試。這個限制對于有效的測試是非常有用的。
兩個重要斷言:響應斷言和JSONAssertion
響應斷言:

image

JSON斷言:

image

4.8. 前置處理器和后置處理器

image

前置處理器(Pre Processors)和后置處理器(Post Processors)負責在生成請求之前和之后完成工作。前置處理器常常用來修改請求的設置,后置處理器則常常用來處理響應的數據。我們主要在動態關聯中用到后置處理器的正則表達式提取器。
https://www.cnblogs.com/fengpingfan/p/4755411.html

4.9. 定時器

定時器(Timer)負責定義請求之間的延遲間隔

image
image

<meta charset="utf-8">

五. Jmeter組件參數化

5.1. 參數化是什么

動態的獲取并設置數據

5.2. 為什么使用參數化

執行批量操作,批量添加批量刪除,人工效率太低
運用程序代替人工獲取并設置數據,安全高效
比如:對被測系統的用戶名和密碼進行參數化,來模擬多個用戶同時登錄系統

5.3. 參數化實現之用戶自定義變量

通過這個功能,能實現多接口共享數據,修改一條即可修改全部

image
image
image
image

Filename:所需數據文件的路徑。如和腳本同一路徑,可直接填寫文件名
File encoding:編碼和文件保持一致即可,默認為ANSI。如有中文,建議為UTF-8
Variable Names:引用變量時的變量名,對應數據文件中的每一列,以逗號分隔。如不填寫,文件的第一行數據將被讀取為變量名
Delimiter:在.txt、.dat文件中,可以用逗號(,)或者Tab鍵(\t)來區分列與列
Allow quote data:選項選為“true”的時候對全角字符的處理出現亂碼
Recycle on EOF:到數據文件結尾時是否循環讀取。設置為True時,線程數過多,數據文件讀取到最后一行時,會再次從第一行開始讀取。設置為False,到達文件結尾時如繼續讀取,則值會默認為<EOF>,可通過設置jmeter屬性csvdataset.eofstring來改變該值。
Stop thread on EOF:Recycle on EOF設置為False,Stop thread on EOF設置為True,則讀取數據文件最后一行后,停止測試,不管還有多少線程組未執行。
Sharing mode:共享模式。默認在所有線程組中使用,可選擇每個線程組單獨打開
相同的部分使用用戶自定義變量
只需要修改一次接口
效果展示

5.4. 參數化實現之CSV Data Set Config

添加CSV Data Set Config:

image

添加界面:

image

通過這個組件可以動態獲取并設置數據,實現批量添加操作
名詞解釋:

Filename:所需數據文件的路徑。如和腳本同一路徑,可直接填寫文件名
File encoding:編碼和文件保持一致即可,默認為ANSI。如有中文,建議為UTF-8
Variable Names:引用變量時的變量名,對應數據文件中的每一列,以逗號分隔。Delimiter:在.txt、.dat文件中,可以用逗號(,)或者Tab鍵(\t)來區分列與列
Allow quote data:選項選為“true”的時候對全角字符的處理出現亂碼
Recycle on EOF:到數據文件結尾時是否循環讀取。設置為True時,線程數過多,數據文件讀取到最后一行時,會再次從第一行開始讀取。設置為False,到達文件結尾時如繼續讀取,則值會默認為<EOF>,可通過設置jmeter屬性csvdataset.eofstring來改變該值。
Stop thread on EOF:Recycle on EOF設置為False,Stop thread on EOF設置為True,則讀取數據文件最后一行后,停止測試,不管還有多少線程組未執行。
Sharing mode:共享模式。默認在所有線程組中使用,可選擇每個線程組單獨打開

添加引用文件:

image

引用:
在jmeter中添加

image
image

線程數改為某個值
查看結果樹:

image

其他:

  1. 線程組線程數改為大于文件中數據的處理:
    遇到結束符在循環
    遇到結束符停止線程
  2. 如果數據來自數據庫
    數據庫導出txt文件

5.5. 使用Jmeter函數助手(文件中不要出現中文):

1、點擊 選項-->函數助手 調出函數助手對話框
2、選擇 _CSVRead 函數(下圖第一個框)
3、函數參數:
 1)第一個參數:填寫文件路徑。
 2)第二個參數:文件列號是從0開始的,第一列0、第二列1、第三列2、依次類推,然后點擊【生成】按鈕,則會自動生成我們需要的參數化函數。
  3) 復制生成的參數化函數, copy過程需要使用的地方即可。
  4) _Random函數是從某數據段隨機讀取數據替換參數,當需要添加多條數據記錄且某些字段需要唯一性時使用。

image
image
image

六. Jmeter正則表達式提取

6.1. 使用正則提取

運用Jmeter正則提取器,可以從請求的響應結果中取到需要的內容,從而實現關聯。關聯是請求與請求之間存在數據依賴關系,需要從上一個請求獲取下一個請求需要回傳回去的數據
正則表達式(regular expression)描述了一種字符串匹配的模式(pattern),可以用來檢查一個串是否含有某種子串、將匹配的子串替換或者從某個串中取出符合某個條件的子串等。

字符 描述
* 匹配前面的子表達式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等價于{0,}。
+ 匹配前面的子表達式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價于 {1,}。
? 匹配前面的子表達式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等價于 {0,1}。
( ) 標記一個子表達式的開始和結束位置。子表達式可以獲取供以后使用。
. 匹配除換行符 \n 之外的任何單字符。要匹配 . ,請使用 . 。

構造正則表達式的方法和創建數學表達式的方法一樣。也就是用多種元字符與運算符可以將小的表達式結合在一起來創建更大的表達式。正則表達式的組件可以是單個的字符、字符集合、字符范圍、字符間的選擇或者所有這些組件的任意組合。
正則表達式提取的相關設置

image
image

說明:

(1)引用名稱:下一個請求要引用的參數名稱,如填寫title,則可用${title}引用它。
(2)正則表達式:
    ():括起來的部分就是要提取的。
    .:匹配任何字符串。
    +:一次或多次。
    ?:不要太貪婪,在找到第一個匹配項后停止。
(3)模板:用$$引用起來,如果在正則表達式中有多個正則表達式,則可以是$2$$3$等等,表示解析到的第幾個值給title。如:$1$表示解析到的第1個值
(4)匹配數字:0代表隨機取值,1代表全部取值,通常情況下填0
(5)缺省值:如果參數沒有取得到值,那默認給一個值讓它取。

案例:api接口

image
image
image
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念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

推薦閱讀更多精彩內容