轉自: http://www.ibm.com/developerworks/cn/aix/library/au-aix-systemsdirector/section2.htmlhtml
如何使用 Java 測試 IBM Systems Director 的 REST APIjava
REST 表明 Representational State Transfer。REST 風格的架構由客戶端和服務器組成。IBM Systems Director 也提供一個基於 RESTFul webservices 的接口。IBM Systems Director 是一個基於 Web 的工具,併爲 REST 提供大量支持。幾乎全部經過 CLI 和 GUI 支持的功能也能夠經過 REST API 支持。REST 使用 HTTP 協議。它支持如下 HTTP 方法:json
有兩種類型的 REST 操做:安全
在這種操做類型中,在做業完成以前,REST API 調用一直保持阻塞。做業完成後,該操做類型將返回 HTTP 返回代碼和響應(如適用)。這種操做類型的返回代碼示例以下:服務器
在這種操做類型中,REST API 調用將啓動一個做業,並提供返回代碼和位置,使用戶可以肯定做業的狀態。用戶能夠查詢位置,或者使用基於 JMS 的偵聽程序,直到操做完成。這種操做類型的返回代碼示例以下:架構
這兩個方法的說明以下:dom
在本節中,咱們將討論使用 Poster 手動測試一些 IBM Systems Director 的基本功能:
如圖 1 所示,您使用 GET 操做能夠列出資源。GET 檢索有關該資源的信息。檢索資源的請求如圖 1 所示:
在圖 1 中,您做爲用戶能夠看到如下信息:
響應如圖 2 所示:
在圖 2 中,您能夠看到 IBM Systems Director 對 GET 請求的響應。響應包括一個返回代碼和響應正文。圖 2 中的返加代碼是 200 (OK),而響應正文是 IBM Systems Director 所返回的全部資源的列表。
發現是 IBM Systems Director 的一個很是基本的操做,用於發現資源。您須要使用 POST 方法進行發現,所以,您須要提供 HTTP 正文 (JSON) 與 HTTP 頭。發現的 HTTP 正文以下:
{ "IPAddress": ["9.1.2.3"], "ResourceTypes": ["Server", "OperatingSystem"] } |
您須要提供資源的 IP 地址和資源類型。使用 POST 操做能夠發現新源,如圖 3 所示。
響應如圖 4 所示:
在圖 4 的 HTTP 響應中要注意一些重要事項:
使用 Location URI 的 GET 操做的響應如圖 5 所示。
在 HttpResponse 中,如圖 5 所示,您能夠看見如下值:
要修改一個現有資源,您須要使用 PUT 操做。對於 PUT 操做,您須要傳遞 HTTP 正文和 HTTP 頭。用於修改資源的 HTTP 正文以下:
{ "Properties": {"DisplayName" : "NewName"} } |
您能夠使用 PUT 操做來修改資源,如圖 6 所示。
對 PUT 請求的響應如圖 7 所示:
如圖 7 所示,IBM Systems Director 返回了 204 做爲返回代碼,這意味着,它沒有內容要返回,而且請求已成功提交。
當您須要刪除資源時,應使用 DELETE 方法。您須要將想刪除的資源 OID 追加到 URI 自己。使用 DELETE 操做可刪除資源,如圖 8 所示。
DELETE 操做的響應如圖 9 所示。
如圖 9 所示,IBM Systems Director 返回了 204 做爲返回代碼,這意味着它沒有內容要返回,而且 DELETE 請求已成功提交。
咱們已介紹了使用 Poster 的四種基本 ISD REST API 操做。一樣地,您也能夠利用該工具或其餘一些您喜歡的工具,手動地測試或使用其餘 IBM Systems Director 功能。您也能夠經過使用編程方式訪問這些 REST API,自動化整個過程。本教程的下一節討論使用 Java 程序執行全部上述 IBM Systems Director REST API 功能所需的步驟。
在這裏,咱們也將看到在上面已經討論過的四個相同功能。咱們已經使用 Apache 的 HttpClient 和 HttpResponse 類調用 REST API,並讀取響應。咱們使用這些類來簡化更新請求頭以及將 HTTP 正文做爲參數傳遞的過程。您甚至能夠使用 Java 的 HttpURLConnection 類,或者您所喜歡的任何其餘實用工具來進行調用。您可以以編程方式來調用 ISD REST API,以下:
GET 操做列出有關該資源的信息。爲了運行 IBM Systems Director 的 GET 請求,咱們須要針對 IBM Systems Director 相關的條目修改 HttpClient 的 sendGetRequest 方法,如清單 3 所示:
. . . sendGetRequest(String uri){ GetMethod method = new GetMethod(uri); method.addRequestHeader(new Header("Accept","application/json")); method.addRequestHeader(new Header("Accept-Language", "en_us")); method.addRequestHeader(new Header("ISDAPIVersion","6.2.1.0")); method.addRequestHeader(new Header ("Authorization", "Basic cm9vdDpnbzRic==")); int statusCode = client.executeMethod(method); return statusCode; } |
在清單 3 的代碼片斷中,您能夠看到如下信息:
在更新 HttpClient 以後,您須要編寫本身的客戶端,以調用 HttpClient 類的 sendGetRequest 方法,以 URI 做爲一個參數。咱們使用了基於 JUnit 的測試來調用 sendGetRequest 方法並檢查返回代碼。
private DWHttpClient httpClient = null; String hostURI = null; @Test public void testListRes() { httpClient = new DWHttpClient(); properties = new Properties(); try { hostURI = "https://1.2.3.4:8422/ibm/director/rest/resources/System"; statusCode = httpClient.sendGetRequest(hostURI); assertEquals(HttpStatus.SC_OK, statusCode); } catch (Exception e) { fail("unexpected exception has happened "+e.getMessage()); e.printStackTrace(); } } |
在清單 4 的代碼中,咱們首先初始化 HttpClient 類的對象,咱們在清單 3 中已修改過該對象。接着,咱們初始化 hostURI,它用於從 IBM Systems Director 檢索資源信息,最後,調用 sendGetRequest() 方法以運行 GET 請求。
咱們使用 JUnit 的 assertEquals() 方法檢查了狀態代碼,驗證它是否 HttpStatus.SC_OK,這實際上表示返回代碼 200。
該 POSToperation 發現了在 IBM Systems Director 中的資源。爲了運行 IBM Systems Director 的 POST 請求,咱們須要針對 IBM Systems Director 相關的條目修改 HttpClient 的 sendPostRequest 方法,並編寫咱們本身的客戶端來調用請求和檢查結果。sendPostRequest 和客戶端的代碼片斷如清單 5 所示:
. . . sendPostRequest(String hostURI, String requestData){ PostMethod method = new PostMethod(uri); method.addRequestHeader(new Header("Content-Type","application/json")); method.setRequestEntity (new StringRequestEntity (requestData, "application/json", "UTF-8")); method.addRequestHeader (new Header ("Authorization", "Basic cm9vdDpnbzRicm9rZQ==")); method.addRequestHeader(new Header("ISDAPIVersion", "6.2.1.0")); int statusCode = client.executeMethod(method); return statusCode; } |
在清單 5 的代碼片斷中,您能夠看到如下信息:
基於 JUnit 的客戶端調用 POST 請求如清單 6 所示:
private DWHttpClient httpClient = null; String hostURI = null; @Test public void testDiscovery() { httpClient = new DWHttpClient(); try { hostURI = "https://1.2.3.4:8422/ibm/director/rest/discover"; String requestData = "{\"IPAddress\": [\"5.6.7.8\"], \"ResourceTypes\": [\"Server\", \"OperatingSystem\"]}"; statusCode = httpClient.sendPostRequest(hostURI, requestData); assertEquals(HttpStatus.SC_CREATED, statusCode); } catch (Exception e) { fail("unexpected exception has happened "+e.getMessage()); e.printStackTrace(); } } |
在清單 6 的代碼中,咱們首先初始化了 HttpClient 類的對象,咱們已在清單 5 的代碼中修改過該對象。而後咱們初始化 hostURI,它用於發如今請求數據中所說起的資源。
在下一步中,咱們調用了 HttpClient 的 sendPosttRequest() 方法,使用 hostURI 和 requestData 做爲參數,而後咱們使用 assertEquals() 方法檢查返回代碼。在請求成功執行後,它返回一個代碼 201,這表示 "CREATED"(已建立)。
因爲 POST 是一個異步操做,您須要跟蹤做業的進度,出於這個緣由,它始終將位置做爲頭的一部分返回。您須要從請求返回的響應對象中檢索響應頭。您能夠使用位置頭的值來檢查進度。請參考下載小節中的樣例類,得到完整代碼。
當您須要修改資源時,要使用 PUT 請求。爲了運行 IBM Systems Director 的 PUT 請求,咱們須要針對 IBM Systems Director 相關的條目修改 HttpClient 的 sendPutRequest 方法,並編寫咱們本身的客戶端來調用請求和檢查結果。sendPutRequest 和客戶端的代碼片斷如清單 7 所示。
. . . sendPutRequest(String uri, String requestData){ PutMethod method = new PutMethod(uri); method.addRequestHeader(new Header ("Content-Type","application/json")); method.addRequestHeader(new Header("ISDAPIVersion", "6.2.1.0")); method.setRequestEntity(new StringRequestEntity (requestData, "application/json", "UTF-8")); method.addRequestHeader(new Header ("Authorization", "Basic cm9vdDpnbzRicm9rZQ==")); int statusCode = client.executeMethod(method); return statusCode; } |
基於 JUnit 的客戶端調用 PUT 請求,如代碼清單 8 所示:
private DWHttpClient httpClient = null; String hostURI = null; @Test public void testModifyResource() throws IOException { httpClient = new DWHttpClient(); hostURI = "https:1.2.3.4:8422/ibm/director/rest/resources/Server/12345"; String requestData = " {\"Properties\": {\"DisplayName\" : \"NewResName\"}}"; statusCode = httpClient.sendPutRequest(hostURI, requestData); assertEquals(HttpStatus.SC_NO_CONTENT,statusCode); } |
在請求成功執行後,IBM Systems Director 返回代碼 204,如代碼清單 8 所示
當您須要刪除資源時,應使用 DELETE 方法。您須要將想刪除的資源 OID 追加到 URI 自己。爲了運行 IBM Systems Director 的 DELETE 請求,咱們須要針對 IBM Systems Director 相關的條目修改 HttpClient 的 sendDeleteRequest 方法,並編寫咱們本身的客戶端來調用請求和檢查結果。sendDeleteRequest 和客戶端的代碼片斷以下所示:
. . . sendDeleteRequest(String uri){ DeleteMethod method = new DeleteMethod(uri); method.addRequestHeader(new Header ("Authorization", "Basic cm9vdDpnbzRicm9rZQ==")); method.addRequestHeader(new Header("ISDAPIVersion", "6.2.1.0")); int statusCode = client.executeMethod(method); return statusCode; } |
基於 JUnit 的客戶端調用 DELETE 請求,以下所示:
private DWHttpClient httpClient = null; String hostURI = null; @Test public void testDiscovery() throws IOException { httpClient = new DWHttpClient(); hostURI = "https://1.2.3.4:8422/ibm/director/rest/resources/Server/12345"; statusCode = httpClient.sendDeleteRequest(hostURI); assertEquals(HttpStatus.SC_NO_CONTENT, statusCode); } |
在請求成功執行後,IBM Systems Director 會返回代碼 204,如代碼清單 10 所示
使用 HTTP 客戶端自動化 REST API 測試的樣例代碼
咱們已對本教程中所說起的全部場景以及一些其餘 POST 操做場景編寫了樣例代碼。該代碼能夠從本教程的下載小節處下載。該代碼包括如下部分:
若是有須要,能夠重用樣例代碼。該代碼也包括一些實用工具類和屬性文件,以下所示:
爲了使代碼更靈活並能夠實現重用,咱們引入了一個屬性文件,您能夠在該文件中輸入 IBM Systems Director 和全部端點的信息。測試用例會在運行時讀取該屬性文件,以檢索這些信息。只需更新該屬性文件,便可在任何系統上運行此代碼。
您能夠運行各個類,以執行任何特定操做。咱們還引入了一個 TestSuite 文件,一次運行全部腳本。
咱們已經建立了一個 ISDSuite 文件,並推出了套裝文件,從 Eclipse 運行全部測試。圖 10 顯示了執行的結果。
您還能夠使用如下命令,從命令提示符運行全部測試:
java org.junit.runner.JUnitCore ISDSuite |
要注意幾個重點:
將上述字符串轉換成 base 64 編碼,並在字符串前面追加 "Basic",而後把它放在 Authorization 頭。例如,Basic "Base64 converted string"
將上述字符串轉換成 base 64 編碼,並在字符串前面追加 "Basic",而後把它放在 Authorization 頭。例如,Basic "Base64 converted string"