一、Jmeter總結
1.回應結果亂碼問題
(1)方案一

修改如下圖:

(2)方案二

2.修改默認語言

3.介面回傳資料中文為Unicode(萬國碼/統一碼)轉中文

(1)步驟如下
1.添加一個后置處理器(BeanShell PostProcessor)
2.撰寫轉譯方法
3.保存,運行


(2)代碼如下
String s2=new String(prev.getResponseData(),“UTF-8”);
//---------------一下步驟為轉碼程序---------------
char aChar;
int len= s2.length();
StringBuffer outBuffer=new StringBuffer(len);
for(int x =0; x <len;){
aChar= s2.charAt(x++);
if(aChar==’\’){
aChar= s2.charAt(x++);
if(aChar==‘u’){
int value =0;
for(int i=0;i<4;i++){
aChar= s2.charAt(x++);
switch(aChar){
case’0’:
case’1’:
case’2’:
case’3’:
case’4’:
case’5’:
case’6’:
case’7’:
case’8’:
case’9’:
value=(value <<4)+aChar-‘0’;
break;
case’a’:
case’b’:
case’c’:
case’d’:
case’e’:
case’f’:
value=(value <<4)+10+aChar-‘a’;
break;
case’A’:
case’B’:
case’C’:
case’D’:
case’E’:
case’F’:
value=(value <<4)+10+aChar-‘A’;
break;
default:
throw new IllegalArgumentException(
“Malformed \uxxxx encoding.”);}}
outBuffer.append((char) value);}else{
if(aChar==‘t’)
aChar=’\t’;
else if(aChar==‘r’)
aChar=’\r’;
else if(aChar==‘n’)
aChar=’\n’;
else if(aChar==‘f’)
aChar=’\f’;
outBuffer.append(aChar);}}else
outBuffer.append(aChar);}
//-----------------以上內容為轉碼程序---------------------------
//將轉成中文的回應結果在查看結果樹中顯示
prev.setResponseData(outBuffer.toString());
————————————————
原文鏈接:https://blog.csdn.net/weixin_42675206/article/details/81064257
4.cookie管理器保存登錄后的cookie資訊(跳過登錄程序,測驗后續介面)
把這個表里的所有資料的名稱、域名、路徑、值都一一寫到cookie管理器里,如下圖jmeter的這個位置

注意:名稱、值、域 必填,路徑可不填寫
(1)進階:批量獲取cookie資訊,跨執行緒組傳遞
1.設定組態檔使Cookie管理器保存cookie資訊,
修改apache-jmeter-5.2.1/bin/jmeter.properties檔案,把CookieManager.save.cookies設定為true,并去掉前面的注釋#號,如下圖所示:

修改完成后保存,退出,并重啟jmeter,
2.在除錯取樣器和請求中查看具體的cookie資訊
在執行緒組中添加HTTP Cookie 管理器,運行測驗計劃后,HTTP Cookie 管理器會自動存盤這些cookie,變數名稱為COOKIE_XXX,XXX對應的是cookie的名稱,可以添加【除錯取樣器】來查看自動存盤的cookie值,如下圖所示:
下圖中有兩個cookie值分別為:COOKIE_z92_lastvisit何COOKIE_z92_visitor

這里要注意一下,有時候你會發現這里的cookie不全,所以比較保險的做法下,進入第一個請求中查看request body中的cookie值,如下圖所示:下圖中有三個cookie值分別為:z92_visitor和z92_lastvisit以及csrf_token三個值,這里比前者多了一個cookie值,

3.設定cookie為全域變數
在BeanShell后置處理程式中使用__setProperty()函式將COOKIE_XXXX設定為全域變數,如下圖所示:

4獲取并存盤Cookie
在HTTP Cookie管理器中通過__P()函式獲取全域變數Cookie,并加入到Cookie管理器中,注意名稱和在請求中的cookie名稱保持一致,如下圖的z92_visitor和z92_lastvisit以及csrf_token三個值,

5.jmeter腳本錄制
①創建執行緒組-創建HTTP代理服務器-修改埠號


②添加排除模式
(懶得手打的跳轉 復制粘貼:https://blog.csdn.net/qq_42293487/article/details/83822604)

③查看本機IP(命令框輸入:ipconfig)記住ip地址

④配置瀏覽器代理
在代理框輸入第三步記住的ip地址,埠號填寫8888,與jmeter修改的埠號保持一致(因為瀏覽器不同,所以入口不一樣,但是設定的步驟是一樣的)

第五步,點擊啟動,啟動之后去剛剛的瀏覽器中操作你要抓包的網站就可以了,(必須要點擊啟動以后,你的瀏覽器才能訪問網路)

原文鏈接:https://blog.csdn.net/qq_42293487/article/details/88105978
6.windows下Jmeter壓測埠占用問題
百度查找有的是解決方法
https://blog.csdn.net/weixin_43757847/article/details/88188091?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control
7.參考外部檔案
(1)參考jar包
一、測驗計劃中添加目錄或jar包到Classpath
操作:測驗計劃->添加目錄或jar包到Classpath–>瀏覽匯入jar包
優點:操作便捷
缺點:1)可移植性差;2)jar包較多時不好管理

二、將需要參考的jar包放在jmeter的extras目錄下
操作:將jar包放在jmeter安裝目錄apache-jmeter-5.0\extras下
優點:比方法1可移植性強一點
缺點:有些jar包放在extras下加載不到,需要放在apache-jmeter-5.0\lib目錄下才可以,導致管理比較混亂

三、通過jmeter.properties設定依賴路徑
操作:1)jmeter目錄下新建一個存放第三方jar包的檔案夾third_dependency,將第三方jar包放進去

2)apache-jmeter-5.0\bin目錄下找到jmeter.properties設定依賴路徑
檔案中添加一行:plugin_dependency_paths= …/third_dependency;

優點:可移植性強,jar包管理方便
來自于https://www.cnblogs.com/Clairewang/p/12550965.html
(2)參考java檔案
添加Bean Shell組件
在bean shel中通過source(“代碼路徑”)方法引入java,然后呼叫方法和java一樣,new一個class,再呼叫里面的add 方法,

代碼:
//參考外部的Java檔案,要用絕對路徑
source(“D:\xingneng_work_file\work_file\test_add.java”);
//new生成物件并呼叫函式
int res = new Myclass().add(1,2);
//生成結果賦值給vars
vars.put(“add”,res.toString());
運行結果:

(3)參考class檔案
Bean Shell使用代碼如下:
用addClassPath(“D:\”)方法引入 class檔案,再用import匯入包及類,然后就可以像java一樣呼叫了

運行結果:

8.json斷言及json提取器的使用
(1)json斷言
該組件使您可以執行JSON檔案的驗證,
首先,它將決議JSON,如果資料不是JSON則失敗,
其次,它將使用https://github.com/json-path/JsonPath中的語法搜索指定的路徑,如果找不到該路徑,它將失敗,
第三,如果在檔案中找到JSON路徑,并要求針對期望值進行驗證,它將執行驗證,對于null值,在GUI中有一個特殊的復選框,請注意,如果路徑將回傳陣列物件,則將對其進行迭代,并且如果找到期望值,則斷言將成功,要驗證空陣列,請使用[]字串,另外,如果patch將回傳字典物件,則在比較之前將其轉換為字串,
什么是JSON
JSON(JavaScript Object Notation,JavaScript物件表示法)是一種輕量級的資料交換格式,JSON容易理解,便于閱讀和撰寫;同時計算機也易于決議和生成,所以JSON有廣泛的應用,
鍵值對的形式存在:

(2)JSON斷言分析:
回傳的資料必須的JSON格式,否則會決議失敗,
他將JsonPath語法搜索指定的路徑,找不到路徑,則會失敗,http://goessner.net/articles/JsonPath/ 這個網址去學習JSON語法,
JSON是鍵值對形式存在,通過路徑找到鍵,可以對該鍵的值進行校驗,
如果鍵的值為null,GUI中有復選框(Expect null),勾選上則表示以null作為預期值,
如果路徑找到的陣列物件(在串列頁中比較常見這種情況),則會對陣列中的資料進行輪詢,如果其中有一個值和預期值匹配,那么斷言也是成功的,
回傳的是字典物件,則需要轉為字串后再進行比較,
(3)JSON斷言界面引數說明:

名稱:節點的名稱,顯示在查看結果樹中,自己根據實際情況定義,
注釋:對該節點進行注釋,
斷言存在JSON路徑:斷言JSON元素的路徑,
附加斷言值:如果要使斷言具有某個值,把這個值勾選上,如果寫了(3)JSON元素的路徑,要把這個值勾選上,
匹配為正則運算式:如果要使用正則表示式,選中該復選框,
預期值:JSON元素路徑對應的值,
反轉斷言:就是否的意思,即如果符合就失敗,
(4)json斷言詳細說明

可以直接在查看結果樹中進行JSON語法的測驗,測驗ok了再直接放在JSON斷言中,
$ 表示跟節點,
[] 表示陣列,0表示第一個;$[0] 表示跟節點后的第一個物件,
resultcode 即key,這里要獲取resultcode的值,所以填寫resultcode,

(5)舉例:
取第一個id的值,$.data[0].id

(1)json提取器
用法說明
此提取器用于提取請求回傳結果中的某個值或者某一組值,用法比正則運算式要簡單,標準寫法為$.key,其中key為回傳結果map中的一個鍵,如果是多層則繼續用.key進行即可,如果遇到key的value值為一個List,則使用.key[n],其中n為list中元素的編號,
原文鏈接:https://blog.csdn.net/df0128/article/details/86535117

(2)Json提取器語法說明





地址:https://blog.csdn.net/df0128/article/details/86535117
9.檔案上傳
(1)創建執行緒組,添加各類組件
這個就不用說了,由于需要登錄,所以我加了一個資訊頭管理器,把token寫在里面,

(2)檔案上傳
有介面檔案的話,那就對著檔案寫,沒api檔案,就自己抓包看了,(注意:我在執行緒組下面加了http資訊頭管理器是因為我下面的“核對資料”和“預覽發送”兩個步驟需要這個Content-Type,單單的上傳檔案是不需要這個組件的,加了反而可能會報錯)


然后點擊高級設定,客戶端實作型別選擇JAVA

(3)查看結果樹
運行一下看一下結果樹的反饋(下面兩個報錯可以忽略,與本主題無關,純粹是懶所以沒改),

10.檔案下載
(1)jmeter檔案下載步驟:
首先檔案下載介面請求資訊填寫完全
然后①右鍵點擊執行緒組->添加->Sampler->Bean Shell Sampler,②或者右鍵點擊執行緒組->添加->后置處理器>Bean Shell Post Processor,本次以Bean Shell Sampler為例,如下圖

輸入腳本:
import java.io.*;
byte[] result = prev.getResponseData(); //這個是獲取到請求回傳的資料,prev是獲取上個請求的回傳
String file_name = “e:\BaiDuTuPian.jpg”; //代表存放檔案的位置和檔案名
File file = new File(file_name);
FileOutputStream out = new FileOutputStream(file);
out.write(result);
out.close();
————————————————
原文鏈接:https://blog.csdn.net/sinat_28317385/article/details/108359217

11.函式的使用
(1)加密函式
①使用內置函式__MD5進行加密
使用 ${__MD5(w12345678,)} 進行MD5加密(32位小寫)

使用KaTeX parse error: Expected group after '_' at position 2: {_?_uppercase(,)} …{__uppercase(${__MD5(w12345678,)},)}
②使用內置函式__digest進行加密
使用${__digest(MD5,w12345678,true,)} 進行MD5加密(默認為小寫,第四個引數傳true可直接回傳大寫)

引數說明:
Digest algorithm(必填):加密演算法,支持:MD2、MD5、SHA-1、SHA-224、SHA-256、SHA-384、SHA-512(其它jmeter自身不支持的加密演算法可使用“7.參考外部檔案的方式解決”),
String to be hashed(必填):需要加密的字串,
Salt to be used for hashing (optional):用于加密的鹽,
Upper case result, defaults to false (optional):大寫結果,默認為false,
Name of variable in which to store the result (optional):存盤結果的變數的名稱,
③使用內置方法加密
Jmeter 4.0 以上版本已有自帶的MD5加密方法
1)添加 BeanShell Sampler,代碼如下:
import org.apache.commons.codec.digest.DigestUtils;
String str = “w12345678”;
String sign = DigestUtils.md5Hex(str);
vars.put(“pw”,sign.toUpperCase());
(2)字串拼接
字串拼接步驟:
1.打開jmeter上的函式助手,選擇—V功能,如下圖:
2.把要拼接的值寫進去:固定字串+取出來的引數(這里的空格為固定字串內的空格,不需要空格的可以去掉)
3.點擊生成,就把生成的字串放到請求頭中去就行了,只有這些引數沒有其他的話,需要把后面的逗號去掉,這樣再運行就可以了


(3)設定全域變數(跨執行緒組傳遞變數)
①打開函式助手

輸入需要的值然后點擊生成按鈕,或者直接使用KaTeX parse error: Expected group after '_' at position 2: {_?_setProperty(ne…{userid},)}的格式
②添加BeanShell 取樣器或者BeanShell PostProcessor后置處理器,設定區域變數userid和token為全域變數newuserid和newtoken

③呼叫方式 ${__property(變數名)}

(4)時間戳
在使用jmeter做介面測驗的時候,經常會要用到日期這種函式,讓系統自動生成一些格式化的資料,方便介面測驗,jmeter自身就帶有時間戳的函式
1、__time:獲取時間戳、格式化時間
(1)、KaTeX parse error: Expected group after '_' at position 2: {_?_time(yyyy-MM-d…{__time(,)}:默認該公式精確到毫秒級別, 13位數 1527822855323
(3)、KaTeX parse error: Expected group after '_' at position 2: {_?_time(/1000,)}:…{__time(yyyy-MM-dd,)}:該公式格式化生成的時間為:2018-10-26
(5)、${__time(yyMMdd,)}:該公式格式化生成的時間為:181026

2、__timeShift(格式,日期,移位,語言環境,變數)函式,可以將時間進行移位,對當前時間增加或者減少對應的時間
(1)、格式 - 將顯示創建日期的格式,如果該值未被傳遞,則以毫秒為單位創建日期,
(2)、日期 - 這是日期值,用于如果要通過添加或減去特定天數,小時或分鐘來創建特定日期的情況,如果引數值未通過,則使用當前日期,
(3)、移位 - 表示要從日期引數的值中添加或減去多少天,幾小時或幾分鐘,如果該值未被傳遞,則不會將任何值減去或添加到日期引數的值中,
“P1DT2H4M5S” 決議為“添加1天2小時4分鐘5秒”
“P-6H3M”決議為“-6小時+3分鐘”
“-P6H3M”決議為“-6小時-3分鐘”
“-P-6H + 3M”決議為“+6小時和-3分鐘”
(4)、區域設定 - 設定創建日期的顯示語言,不是必填項
(5)、變數 - 創建日期的值將被分配給的變數的名稱,不是必填項

e.g.:${__timeShift(yy-MM-dd,2018-10-26,P2D,,)}這種回傳的時間就是2018-10-28
3、__randomDate(格式,開始時間,結束時間):時間段內隨機獲取時間
(1)格式默認為yyyy-MM-dd

e.g.😒{__randomDate(yyyy-MM-dd,2018-10-01,2018-10-30)},這種函式就會自動回傳20181001-20181030之間的一個日期
(5)jmeter隨機取用戶自定義變數的值
${__RandomFromMultipleVars(用戶自定義的變數1|用戶自定義的變數2)}
用法一:可以在beanshell中將取到的隨機值賦給變數s,在參考時直接參考ss即可
s=${__RandomFromMultipleVars(P1|P2,)};
vars.put(“ss”,s.toString());
用法二:在請求體或其他直接為變數賦值的地方,直接使用${__RandomFromMultipleVars(用戶自定義的變數1|用戶自定義的變數2)}
轉載于:https://www.cnblogs.com/applezxy/p/11124184.html
(6)自增函式和計數器
"_counter"函式
功能:這個函式是一個計數器,用于統計函式的使用次數,它從1開始,每呼叫這個函式一次它就會自動加1,它有兩個引數,第一個引數是布爾型的, 只能設定成“TRUE”或者“FALSE”,如果是TRUE,那么每個用戶有自己的計數器,可以用于統計每個執行緒歌執行了多少次,如果是FALSE,那就 使用全域計數器,可以統計出這次測驗共運行了多少次,第二個引數是“函式名稱”
格式:${__counter(FALSE,test)}
使用:我們將“_counter”函式生成的引數復制到某個引數下面,如果為TRUE格式,則每個執行緒各自統計,最大數為回圈數,如果為FALSE,則所有執行緒一起統計,最大數為執行緒數乘以回圈數
計數器
Jmeter計數器實作自增功能
如果需要參考的資料量較大,且要求不能重復或者需要自增,那么可以使用計數器來實作
如:新增功能,要求名稱不能重復
1.新增計數器
計數器:允許用戶創建一個在執行緒組之內都可以被參考的計數器,
計數器允許用戶配置一個起點,一個最大值,增量數,回圈到最大值,然后重新開始,繼續這樣,直到測驗結束,


初始值(Starting value):給定計數器的起始值、初始值,第一次迭代時,會把該值賦給計數器
遞增(Increment):每次迭代后,給計數器增加的值
最大值(Maximum value):計數器的最大值,如果超過最大值,重新設定為初始值(Starting value),默認的最大值為Long.MAX_VALUE,2^63-1(如果持續壓測,建議最好不要設定最大值)
數字格式(Number format):可選格式,比如000,格式化為001,002;默認格式為Long.toString(),但是默認格式下,還是可以當作數字使用
參考名稱(Reference Name):用于控制在其它元素中參考該值,形式:${reference_name}
與每用戶獨立的跟蹤計數器(Track Counter Independently for each User):全域的計數器,如果不勾選,即全域的,比如用戶#1 獲取值為1,用戶#2獲取值還是為1;
如果勾選,即獨立的,則每個用戶有自己的值:比如用戶#1 獲取值為1,用戶#2獲取值為2,
每次迭代復原計數器(Reset counter on each Thread Group Iteration):可選,僅勾選與每用戶獨立的跟蹤計數器時可用;
如果勾選,則每次執行緒組迭代,都會重置計數器的值,當執行緒組是在一個回圈控制器內時比較有用,
2.參考計數器

12.控制器
https://www.cnblogs.com/Zfc-Cjk/p/8466136.html 詳解
①回圈控制器

②ForEach控制器


這樣就再去執行這個控制器就會執行兩遍,也可以截取其他集合的變數作為引數來遍歷,
③僅一次控制器

④事務控制器

可以理解為一個流程場景,例如發布流程、交易等,需先新建、編輯、提交審核、發布,所有的介面都成功才能發布成功,將流程場景涉及到的所有介面放到一個事務里即可,
特別說明:添加事務后在聚合報告中請求按照事務進行統計,事務中某一個請求報錯即整個事務報錯,
⑤IF控制器

判斷填寫的條件是否成立,成立則執行控制器下的組件
⑥Switch控制器 (這個理論上是不是也可以里面加其他控制器)

⑦吞吐量控制器

作用:控制其下的子節點的執行次數與負載比例分配,別被名字迷惑了,跟吞吐量沒任何關系,也有兩種方式:
Total Executions:設定運行次數,整個測驗計劃中總計執行次數
Percent Executions:設定運行比例(1~100之間),整個測驗計劃中總計執行百分比
Throughtput: 設計的數值
Per User: 依據網上的說明在選擇Total Executions時,勾選時會在每個執行緒中執行的次數,但在3.0版本中嘗試使用無效
⑧隨機控制器

⑨隨機順序控制器

其他控制器 先看頂部網址!!!
13.檔案大小及檔案md5值獲取
步驟:
①參考jar包(jar包在該檔案同級目錄)
jar包名稱: commons-codec-1.15.jar

②添加前置處理器→BeanShell PreProcessor

③參考

④查看運行結果

14.jmeter除錯工具(Debug Sampler)的使用

使用Jmeter開發腳本時,難免需要除錯,這時可以使用Jmeter的Debug Sampler,它有三個選項:JMeter properties,JMeter variables,System properties:

1、JMeter properties和System properties:通常都選false,這兩個就是JMeter和系統的屬性,在Jmeter的bin的jmeter.properties中定義,一般都不會變,
2、JMeter variables:這個是我們自已定義的變數,定義的方式有如下這些:
a) 選中測驗計劃(Test plan),在右邊的面板上添加User Defined Variables
b) 選中執行緒組,右鍵選擇 配置元件( config element)–>User Defined Variables
c) 通過后置處理器生成的變數
d)使用csv引數化的變數

15.jmeter-CSV引數化
①創建CSV檔案
創建.csv檔案,用戶名和密碼中間以逗號隔開

② 在執行緒組中添加并配置CSV Data Set Config
1.添加CSV Data Set Config

2.配置CSV Data Set Config(檔案地址可以寫相對路徑,“./為bin目錄下”)

?Filename: 指保存資訊的檔案目錄,可以相對或者絕對路徑,否則會在jmeter日志檔案(jmeter.log目錄位置D:\Program Files\apache-jmeter-2.13\bin)中提示:系統找不到指定檔案,運行腳本后,登錄失敗,
?File encoding: 保持默認,默認為ANSI
?Variable Names: 給csv檔案中各列起個名字(有多列時,用英文逗號隔開列名)便于后面參考
?Delimiter:與 .csv檔案的分隔符保持一致,如檔案中使用的是逗號分隔,則填寫逗號;如使用的是TAB,則填寫\t;
?Allow quoted data? :是否允許參考資料,—這個目前還未弄明白,設定成True或者False都能正常參考資料,
?Recycle on EOF?:到了檔案尾是否回圈,True—繼續從檔案第一行開始讀取,False—不再回圈
?Stop thread on EOF? :到了檔案尾是否停止執行緒,True—停止,False—不停止,注:當Recycle on EOF設定為True時,此項設定無效,
?Sharing mode:共享模式,All threads –所有執行緒,Current thread group—當前執行緒組,Current thread—當前執行緒,

All threads:計劃中所有執行緒,假如說有執行緒1到執行緒n (n>1),執行緒1取了一次值后,執行緒2取值時,取到的是csv檔案中的下一行,即與執行緒1取的不是同一行,
2 Current thread group:當前執行緒組,假設有執行緒組A、執行緒組B,A組內有執行緒A1到執行緒An,執行緒組B內有執行緒B1到執行緒Bn,取之情況是:執行緒A1取到了第1行,執行緒A2取第2行,現在B1取第1行,執行緒B2取第2行,
2 Current thread:當前執行緒,假設測驗計劃內有執行緒1到執行緒n (n>1),則執行緒1取了第1行,執行緒2也取第1行,
③參考csv檔案中的資料
1.找到需要傳遞引數的HTTP請求
2.將具體值改為變數參考,參考變數:${變數名}

④讀取的csv資料中文亂碼問題
將資料存盤到txt中,另存為帶有bom的utf-8格式,然后修改檔案后綴為csv即可
16.jmeter-回傳結果生成CSV檔案
(1)步驟
①本次為方便演示故添加csv資料檔案設定組件,實際場景應添加JSON提取器,存盤提取到的回傳資料,

CSV檔案使用記事本或Notepad++打開,列之間實際是英文“,”表示,此處需要記住,
CSV引數設定參考“標題15”
②添加http請求,在請求下添加BeanShell PostProcessor

代如下碼:
FileWriter fstream = new FileWriter("./test01/444.csv",true); //tuer為寫入,不填寫默認false為清除
BufferedWriter out = new BufferedWriter(fstream);
//String logo = vars.get(“name”);
//logo = logo.replaceAll(",",""); 此處注釋內容為引數中有多余的“,”時,將逗號轉為空字符或其內容,以免檔案列錯位
//vars.put(“logo”,logo);
out.write(vars.get(“name”)); //寫入name的值 注意此處通過get只能調取變數,且直接填寫變數名稱!
out.write(","); //寫入英文逗號,csv列之間用逗號分隔
out.write("
s
e
x
"
)
;
/
/
直
接
寫
入
字
符
或
變
量
,
此
時
變
量
需
要
{sex}"); //直接寫入字符或變數,此時變數需要
sex");//直接寫入字符或變量,此時變量需要{}參考
out.write(",");
out.write(vars.get(“age”));
out.write(System.getProperty(“line.separator”)); //換行
//out.write("\n"); 寫入“\n”也可實作換行
out.close();
fstream.close();
③運行結果

④思考1?
是否可先清除模式打開檔案,寫入變數的標題,在介面回傳時再次用寫入模式打開檔案錄入資料,從而達到每次啟動自動清除檔案內容的目的,

結果:

思考2?
多個請求的回傳引數寫入同一個檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/355307.html
標籤:其他
