[Tutorial] JMeter - Process JSON response with BeanShell Processor
บ่อยครั้งที่ request body นั้นต้องการเอาค่าจาก response ของอีก service หนึ่ง.
เป็นอันเสร็จสิ้นการเตรียมการ ต่อไปให้เปิด JMeter ขึ้นมาเลยฮะ.
server: www.google.com.sg
path: /s?biw=1600&bih=809&sclient=psy-ab&q=json%20parser%20example&oq=&gs_l=&pbx=1&bav=on.2,or.r_qf.&bvm=bv.85970519,d.c2E&fp=a91f5977af3367b7&es_sm=0&pf=p&sugexp=msedr&gs_rn=61&gs_ri=psy-ab&pq=json%20parser%20example&cp=20&gs_id=1e&xhr=t&es_nrs=true&tch=1&ech=2&psi=XHTlVOPiIonmuQSD7oLIBg.1424323680476.3
โค้ดตัวอย่างนะฮะ. ที่ Highlight เอาไว้นั่นคือส่วนที่เรียกใช้ JSON Simple เพื่อ parse JSON string ที่เราเตรียมไว้.
ท่านผู้ชมสามารถ download ตัวอย่างได้จาก: https://drive.google.com/file/d/0B69Rt-ghTQqyMkFISDlLNHpuOE0/view?usp=sharing
JMeter ได้เตรียมเครื่องมือเอาไว้ extract data จาก response เอาไว้ให้หลายแบบด้วยกัน. แต่ทว่าในกรณีที่ response นั้นมีโครงสร้างซับซ้อน เช่น JSON หรือ XML, เราอาจจะต้องเขียนโปรแกรมเพื่อประมวลผล response ด้วยตัวเอง.
ในบทความนี้จะแสดงตัวอย่างการประมวลผล response ที่เป็น JSON โดยใช้ BeanShell Processor.
เตรียม Library เพื่อประมวลผล JSON
- เริ่มต้นด้วยการไปโหลด library สำหรับจัดการ JSON มาก่อนนะฮะ. โดยส่วนตัวผมชอบใช้ json-simple, สามารถ download JAR ได้จาก https://code.google.com/p/json-simple/ มองหาคำว่า Downloads จากเมนูซ้ายมือ ให้เลือกโหลดไฟล์ .jar นะฮะ. ยกตัวอย่างเช่น json-simple-1.1.1.jar.
- จากนั้นให้ copy json-simple-1.1.1.jar ไปวางใน folder lib ที่อยู่ภายใน folder ของ JMeter. เช่น \apache-jmeter-2.12\lib ดัง Figure 1.
|  | 
| Figure 1 Address ของ folder lib | 
เป็นอันเสร็จสิ้นการเตรียมการ ต่อไปให้เปิด JMeter ขึ้นมาเลยฮะ.
การประมวลผล JSON
ในตัวอย่างนี้ บัวบานจะประมวลผล JSON ที่ได้จาก auto-suggest service ของ google ให้ชม. โดยจะใช้ keyword ว่า "json parser example"|  | 
| Figure 2 ตัวอย่าง auto-suggest ของ google | 
path: /s?biw=1600&bih=809&sclient=psy-ab&q=json%20parser%20example&oq=&gs_l=&pbx=1&bav=on.2,or.r_qf.&bvm=bv.85970519,d.c2E&fp=a91f5977af3367b7&es_sm=0&pf=p&sugexp=msedr&gs_rn=61&gs_ri=psy-ab&pq=json%20parser%20example&cp=20&gs_id=1e&xhr=t&es_nrs=true&tch=1&ech=2&psi=XHTlVOPiIonmuQSD7oLIBg.1424323680476.3
- สร้าง HTTP Sampler 
 - ใส่ server เป็น www.google.com.sg
 - ใส่ path เป็น /s?biw=1600&bih=809&sclient=psy-ab&q=json%20parser%20example&oq=&gs_l=&pbx=1&bav=on.2,or.r_qf.&bvm=bv.85970519,d.c2E&fp=a91f5977af3367b7&es_sm=0&pf=p&sugexp=msedr&gs_rn=61&gs_ri=psy-ab&pq=json%20parser%20example&cp=20&gs_id=1e&xhr=t&es_nrs=true&tch=1&ech=2&psi=XHTlVOPiIonmuQSD7oLIBg.1424323680476.3
- คลิกขวาที่ HTTP Sampler ที่เพิ่งสร้างขึ้นมา แล้วเลือก Add > Post Processors > BeanShell PostProcessor
-  Copy เอา script ข้างล่างไปใส่ใน BeanShell PostProcessor. ดู Figure 3 ประกอบ. Figure 3 การสร้าง BeanShell PostProcessor 
- จากนั้นให้เปิด Log Viewer ขึ้นมาโดยไปกดที่เมนู Options > Log Viewer. พอกดแล้วจะมีกรอบยื่นออกมาทางด้านล่าง.
- กด Start teste ได้เลย
|  | 
| Figure 4 ผลลัพธ์จากการทดสอบ | 
โค้ดตัวอย่างนะฮะ. ที่ Highlight เอาไว้นั่นคือส่วนที่เรียกใช้ JSON Simple เพื่อ parse JSON string ที่เราเตรียมไว้.
import org.json.simple.JSONObject;
import org.json.simple.JSONArray;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
  
try {
 /////// Start prepare JSON string //////
 // get response from last response message
 String response = prev.getResponseDataAsString();
 // Google returns a lot of JSON object in one response, each object is separated by /*""*/ 
 // So we split response by /*""*/ 
 response = response.substring(0,response.length()-6);
 String[] res = response.split("/\\*\\\"\\\"\\*/");
 // Walk through array of JSON object
 for(int i=0; i < res.length; i++)
 {
  // Some nodes in JSON contains "[" and "]" which are invalid so we replace them
  // Replace \" with "
  // Replace "[ with [  
  // Replace ]" with ] 
  String tmpRes = res[i];
  tmpRes = tmpRes.replace("\\\"","\"");
  tmpRes = tmpRes.replace("\"[","[");
  tmpRes = tmpRes.replace("]\"","]");
  // Finally, JSON string is ready for us. Let's parse it
  log.info(tmpRes);
  JSONParser parser = new JSONParser(); 
  Object obj = parser.parse(tmpRes);
  JSONObject jsonObj = (JSONObject) obj; 
  // Auto-suggest results are in JSON node "d"
  JSONArray dArr = (JSONArray) jsonObj.get("d");
  JSONArray sugestArr = (JSONArray) dArr.get(1);
  // Print each result to Log
  for(int j=0; j < sugestArr.size();j++)
  {
   log.info(""+sugestArr.get(j)); 
  }
 }
}
catch(ParseException e) {
 e.printStackTrace();
}
ท่านผู้ชมสามารถ download ตัวอย่างได้จาก: https://drive.google.com/file/d/0B69Rt-ghTQqyMkFISDlLNHpuOE0/view?usp=sharing
 
https://truthbet.com/af/B1QfJKDQQ
ตอบลบเลือกรับได้ทุกโปรโมชั่น!!!
โปรโมชั่น 20 % ฝากเงินสูงสุด 10,000 บาท รับเพิ่ม 20% (2,000) ทำเทิร์น 10 เท่า (120,000) ถอนได้ตามยอดคงเหลือ
โปรโมชั่น 50 % ฝากเงินสูงสุด 10,000 บาท รับเพิ่ม 50% (5,000) ทำเทิร์น 20 เท่า (300,000) ถอนได้ตามยอดคงเหลือ
โปรโมชั่น 100 % ฝากเงินสูงสุด 10,000 บาท รับเพิ่ม 100% (10,000) ทำเทิร์น 50 เท่า (1,000,000) ถอนได้ตามยอดคงเหลือ
https://truthbet.com/af/B1QfJKDQQ
ตอบลบเลือกรับได้ทุกโปรโมชั่น!!!
โปรโมชั่น 20 % ฝากเงินสูงสุด 10,000 บาท รับเพิ่ม 20% (2,000) ทำเทิร์น 10 เท่า (120,000) ถอนได้ตามยอดคงเหลือ
โปรโมชั่น 50 % ฝากเงินสูงสุด 10,000 บาท รับเพิ่ม 50% (5,000) ทำเทิร์น 20 เท่า (300,000) ถอนได้ตามยอดคงเหลือ
โปรโมชั่น 100 % ฝากเงินสูงสุด 10,000 บาท รับเพิ่ม 100% (10,000) ทำเทิร์น 50 เท่า (1,000,000) ถอนได้ตามยอดคงเหลือ