转自: 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"