建立Java API請求

如下內容是馬老師培訓的,也本身玩了一下,弄了一下午啊,中間都要放棄了,多點了個workplace,致使怎樣都跑不通,最後,終於跑通了。java

建立Java API請求apache

目的:以百度天氣預報查詢API服務爲例,建立Java API請求範例。json

  1. API服務信息

參考文檔:https://blog.csdn.net/younghaiqing/article/details/54799303api

接口示例:http://api.map.baidu.com/telematics/v3/weather?location=北京&output=json&ak=amMXVSEUGt6yU95x4DQOC2Um瀏覽器

/telematics/v3/weather?output=json&ak=amMXVSEUGt6yU95x4DQOC2Ummaven

百度ak申請地址:http://lbsyun.baidu.com/apiconsole/key工具

接口參數說明:性能

                    

返回結果:開發工具

 

 2.建立Java工程測試

2.1    分析API服務接口

接口示例以下:

http://api.map.baidu.com/telematics/v3/weather?location=北京&output=json&ak=yourkey

輸出的數據格式,默認爲xml格式;當output設置爲'json'時,輸出的爲json格式的數據。

經過觀察接口示例,能夠判斷HTTP請求方式爲GET。

——GET方法向URL添加數據。

 

2.2    寫出API服務請求

(展現BaiduWeather_originalV1.java)

簡述由V1到V2的變化。

 

 

 3.轉化Jmeter JavaSampler

3.1    建立Maven工程

在Eclipse左側的Package Explore點擊右鍵,依次選擇New -> Other -> Maven -> Maven Project:

 

 

 

這裏要注意,以前建立的API請求類,不是必定要基於Maven工程,普通的Java Project就能夠;建立Maven Project是爲了開發和調試Jmeter JavaSampler。

爲了方便演示,將全部的Java類都建立在同一個Maven Project下。

 

 

 

3.2    添加依賴包

打開Maven工程的POM.xml文件,添加依賴包。咱們須要的依賴包以下:

-          Junit:工程建立時已存在;

-          Jmeter:核心,做爲JavaSampler請求;有三個組件須要添加:ApacheJMeter_core、ApacheJMeter_java、ApacheJMeter_components;

-          log4j-over-slf4j:爲了解決調試階段log4j紅字報錯,非必選,也能夠用其餘依賴包替代。

完成後的POM.xml文件以下:

-            <project xmlns="http://maven.apache.org/POM/4.0.0"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

-              xsi:schemaLocation="http://maven.apache.org/POM/4.0.0   http://maven.apache.org/xsd/maven-4.0.0.xsd">

-                    <modelVersion>4.0.0</modelVersion>

-             

-                    <groupId>com.ane56.tester</groupId>

-                    <artifactId>Jmeter_JavaSampler</artifactId>

-                    <version>0.0.1-SNAPSHOT</version>

-                    <packaging>jar</packaging>

-                   

-                    <name>Jmeter_JavaSampler</name>

-                    <url>http://maven.apache.org</url>

-                   

-                    <properties>

-                             <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

-                    </properties>

-             

-                    <dependencies>

-                             <dependency>

-                                       <groupId>junit</groupId>

-                                       <artifactId>junit</artifactId>

-                                       <version>3.8.1</version>

-                                       <scope>test</scope>

-                             </dependency>

-                    

-                    <!--   https://mvnrepository.com/artifact/org.slf4j/log4j-over-slf4j -->

-                             <dependency>

-                                 <groupId>org.slf4j</groupId>

-                                 <artifactId>log4j-over-slf4j</artifactId>

-                                 <version>1.7.25</version>

-                             </dependency>

-                     

-                    <dependency>

-                                 <groupId>org.apache.jmeter</groupId>

-                                 <artifactId>ApacheJMeter_core</artifactId>

-                                 <version>3.3</version>

-                             </dependency>

-                            

-                             <dependency>

-                                 <groupId>org.apache.jmeter</groupId>

-                                 <artifactId>ApacheJMeter_java</artifactId>

-                                 <version>3.3</version>

-                             </dependency>

-                            

-                             <dependency>

-                                 <groupId>org.apache.jmeter</groupId>

-                                 <artifactId>ApacheJMeter_components</artifactId>

-                                 <version>3.3</version>

-                             </dependency>

-                            

-              </dependencies>

-            </project>

 

3.3    理解Java Sampler套路

首先:要實現AbstractJavaSamplerClient類,才能被Jmeter加載;建立名爲「BaiduWeather_JavaSamplerV1」的Java類,添加對AbstractJavaSamplerClient類的實現;完成後以下:

public class BaiduWeather_JavaSamplerV1 extends AbstractJavaSamplerClient {

……

}

 

其次:(對比LoadRunner腳本的結構:)

-          設置參數:getDefaultParameters,用於設置傳入的參數;

-          初始化(init):setupTest,用於初始化性能測試時的每一個線程;

-          執行迭代(action):runTest,爲性能測試時的線程運行體;

-          完成退出(end):teardownTest,爲測試結束方法,用於結束性能測試中的每一個線程。

補充:調試腳本的main()方法。

 

3.4    詳解getDefaultParameters()

在getDefaultParameters()代碼段中,添加請求的參數;

 

做用:當Jmeter讀取此JavaSampler後,可以讀出請求的參數到列表:

 

注意:

在getDefaultParameters()代碼段中,只須要添加參數項的名字,而沒必要要賦值。一般咱們會在Jmeter腳本中,對請求參數進行參數化。

 

讀取參數的代碼:

 

 

 

3.5    詳解runTest()格式

-          建立sampleResult:private SampleResult sampleResult;

-          給請求貼標籤:sampleresult.setSampleLabel("Java請求");

-          把請求的信息,寫到Jmeter的【察看結果樹 – 請求】頁面:

       sampleresult.setSamplerData(httpUrl);

       sampleresult.setDataType(SampleResult.TEXT);

-          發送請求時,開始計時:sampleresult.sampleStart();

-          收到應答後,結束統計響應時間:sampleresult.sampleEnd();

-          標記得到成功的應答,對應http 200:sampleresult.setResponseCodeOK();

-          把收到的應答內容,寫到Jmeter的【察看結果樹 – 響應數據】頁面:

sampleresult.setResponseData("結果是:"+ result, "utf-8");

       sampleresult.setDataType(SampleResult.TEXT);

 

3.6    調試腳本的main()

1)首先要進行參數賦值,不然將直接使用getDefaultParameters()代碼段中設置的參數默認值。建議賦值,與Jmeter的實際工做方式保持一致。

2)調用BaiduWeather_JavaSamplerV1,建立一次測試執行。

 

 

 

 

 

4.導出Maven工程

4.1    導出依賴包

選中工程,點擊右鍵,在菜單中選擇Run As -> Run Configuration:

 

1)    首先在左側的列表中,選擇Maven Build,而後點擊左上方的新建圖標;

2)    輸入操做的名字,在本例中是:Jmeter_JavaSampler_exportDependency;

3)    定位當前操做的工程路徑;能夠點擊Workspace…的按鈕來定位;

4)    輸入操做的具體命令:在本例中是爲了導出依賴:dependency:copy-dependencies;

5)    檢查Maven Runtime的信息是否正確;

6)    點擊Apply按鈕完成保存;

7)    點擊Run按鈕、進行依賴包的導出。

 

 

等待完成後,到工程所在的路徑\target\dependency目錄,查看的依賴jar包:

 

 

4.2    導出測試類

導出測試類有兩種方式:

1)Maven install命令:該命令會在工程所在的路徑\target文件夾下,生成與工程同名的jar文件,如Jmeter_JavaSampler-0.0.1-SNAPSHOT.jar。不推薦這樣的方式,由於這將導出工程中全部的類,不夠精確。

2)直接導出單個接口測試類,注意是符合Jmeter JavaSampler的那個類。具體方法是:在Eclipse左側的Package Explore選中該類,點擊右鍵,選擇Export:

 

 

 

輸入要導出JAR file的路徑和名稱,點擊Finish按鈕,完成導出操做。

 

  1. 在Jmeter建立測試計劃

5.1    準備工做

首先,要將導出的依賴包,拷貝到jmeter\lib目錄下。推薦將整個dependency文件夾拷過來,而後再引入到測試計劃。這樣的好處在於大量的依賴包中存在與原有jmeter\lib目錄下的同名或不一樣版本的干擾。以下圖:

 

 

而後,將單獨導出的接口測試類的jar文件複製到jmeter\lib\ext目錄下,以下圖:

 

這裏的jar文件有個問題,先賣個關子,在後面分析解決思路。

完成後,進入下一環節。

 

5.2    建立測試計劃

啓動Jmeter,在測試計劃的主窗口的靠下位置,添加依賴到classpath中;經過點擊瀏覽按鈕,定位到依賴包的文件夾,全選全部的jar文件,點擊打開按鈕:

 

 

 

第一步完成後,添加線程組,並添加Java請求;

 

 

在類名稱的下拉菜單中,找到咱們開發的測試類BaiduWeather_JavaSamplerV1:

 

 

 

 

5.3    調試腳本

填寫請求參數,填充本來爲空的參數、缺省值能夠替換也可保留:

 

 

添加一個監聽器 – 察看結果樹,以便查看腳本調試的結果:

 

 

 

 

點擊剛剛添加的察看結果樹,將主畫面切換到結果樹:

 

 

在調試前,須要保存腳本成.jmx文件。點擊保存按鈕,將腳本存放到合適的位置。

點擊上方工具條內的啓動按鈕,查看測試結果:

 

Text區域,每執行一次請求,就自動增長一條記錄到尾部。

右側的區域,有三個Tab頁,方便查看測試請求和響應。咱們分別查看一下,注意判斷響應數據是否爲正確的。

 

請求頁面:

 

沒問題,確實與預期的同樣。

再看響應數據頁面:

 

顯示error -3, No result available,出錯了。

 

 

5.4    解決問題

解決步驟:

先將請求內容,放到瀏覽器中,查看是否能得到正確的天氣預報信息:

 

成功了,說明API 服務沒問題,請求內容也沒問題。是哪裏不對呢?

首先想到的,是否由於百度天氣預報API對不是瀏覽器訪問的Request作了屏蔽?相似與反爬蟲策略。那就須要在請求時,補全HTTP Header信息。

那麼HTTP Header信息哪裏能查看?

這裏能夠利用Chrome瀏覽器的開發工具,按F12後,刷新一下,瀏覽器會自動錄製整個請求和應答。

 

 

這樣就能捕獲到HTTP Header信息,將它們逐條複製下來。在Jmeter的線程組下面添加一個配置元件 - HTTP頭信息管理,再逐條添加進去。

再次執行腳本,錯誤依舊如此。

 

思路錯了嗎?其實沒有,方法是正確的,再想一想。

 

 

 

正確的方法以下:

仔細查看一下Request RUL,以下圖:

 

 

和瀏覽器的地址欄中的內容比較一下,「location=上海」在Request中,被替換成了「location=%E4%B8%8A%E6%B5%B7」。

這是漢字沒有轉碼所致使的:

咱們從Jmeter發出的漢字不是URL編碼的格式。

 

再想一想,咱們在Eclipse調試接口腳本的時候,應答信息和瀏覽器中顯示的內容是同樣的;這意味着從Eclipse發出的Request,已經被自動轉碼了,有點坑啊!

 

所以,咱們須要對城市名稱的漢字進行轉碼,並且要在接口請求的代碼裏完成。

爲完成轉碼功能,須要再增長一個依賴:

import java.io.UnsupportedEncodingException;

 

 

 

修改後,爲以下圖所示:

 

 

這裏增長了一個轉碼的步驟,將接收到的城市名稱從漢字轉碼爲URL格式的。執行一下看看效果:

 

成功了!

從新將接口測試類導出成jar文件,刪除先前存在於jmeter\lib\ext下的同名文件;再拷貝一遍。Jmeter也要重啓纔會刷新Java請求中的類列表。

重啓後,打開以前保存的腳本,再次運行調試;執行成功。

 

相關文章
相關標籤/搜索