前些日子看了些openstack方面的API文档,心想着命令行调API太麻烦,能不能用编程的方式来试下,当然这些日子也一直在学python+django,感觉这个语言是非常强大,但局限于接触时间不是很长,对它的掌控力也只限于表面,所以我尝试着用JAVA的知识来对这些API进行调用,因为有三个多月没接触JAVA了,多少还是有些生疏,花了一天半的时间,实验终于成功。

    废话就不多说了,说说这一天的半的情况。

    先是昨天来讲,我打算用java 的servlet 看能不能实现张垚用django实现的demo,理论上其实是可以实现的,对后来卡在servlet的http header请求头上了,网上查了很多资料,最后才知道,原来servlet的请求头是内置的,等于说是固定死了,它固定就只能就是那几个请求头,我们所能做的就是对这些固定的请求头进行操作,不能自定义添加我们想要的请求头,比如说我们想加个 x-autho-token,它内部是不认它的。

    碰了一点灰,然后想想JAVA肯定还有别的框架,网上查了下,就Jersey这个框架最贴近我们现有的需求,因为它是基于REST web server 来开发的。

    当然REST WEB SERVER的开发暂时我们也用不上,我们现在是调用Openstack这个已经搭建好的的Server的 API,就好比我们在火狐上装一个REST 客户端插件,直接在这个客户端写上我们需要的参数一样,我们暂时也只用得上Jersey的客户端功能,而我做的实验其实也只是脱离浏览器,用JAVA的知识搭建我自己的REST客户端然后来调用Openstack的API。
具体实现是在你所用IDE(我用的是MyEclipse)里面引入Jersey需要的jar包,我在官网上下了两个客户端需要的jar包,这个可以根据你的需要进行下载,我把网址分享下吧:

http://jersey.java.net/nonav/doc ... e.html#chapter_deps

这个也其实是jersey的官网,里面包括了它的用法文档。

写了一段测试代码

//引入jersery的客户端包
import com.sun.jersey.api.client.*;

public class Test {
        
        public static void main(String[] args) {        
                //通过提供的api创建一个客户端
                        Client client = Client.create();
                //你需要通过创建的客户端来创建一个WebResource对象来封装客户端所需要的 Web 资源。
                        WebResource webResource = client.resource("http://192.168.2.62:8774/v1.1/1/flavors/detail");
                //给这个请求资源加上所需要的请求头发送出去然后得到所需要的资源然后把这些转换成string
                        String s = webResource.header("X-Auth-Project-Id","1").header("X-Auth-Token","openstack").get(String.class);        
                //把这个返回的String打印出来
                        System.out.println(s);
//引入jersery的客户端包
import com.sun.jersey.api.client.*;

public class Test {
        
        public static void main(String[] args) {        
                //通过提供的api创建一个客户端
                        Client client = Client.create();
                //你需要通过创建的客户端来创建一个WebResource对象来封装客户端所需要的 Web 资源。
                        WebResource webResource = client.resource("http://192.168.2.62:8774/v1.1/1/flavors/detail");
                //给这个请求资源加上所需要的请求头发送出去然后得到所需要的资源然后把这些转换成string
                        String s = webResource.header("X-Auth-Project-Id","1").header("X-Auth-Token","openstack").get(String.class);        
                //把这个返回的String打印出来
                        System.out.println(s);




返回了一个JSON对象信息:  

{"flavors": [{"rxtx_quota": 0, "name": "m1.medium", "links": [{"href": "http://192.168.2.62:8774/v1.1/1/flavors/3", "rel": "self"}, {"href": "http://192.168.2.62:8774/1/flavors/3", "rel": "bookmark"}], "ram": 4096, "vcpus": 2, "rxtx_cap": 0, "swap": 0, "disk": 40, "id": 3}, {"rxtx_quota": 0, "name": "m1.large", "links": [{"href": "http://192.168.2.62:8774/v1.1/1/flavors/4", "rel": "self"}, {"href": "http://192.168.2.62:8774/1/flavors/4", "rel": "bookmark"}], "ram": 8192, "vcpus": 4, "rxtx_cap": 0, "swap": 0, "disk": 80, "id": 4}, {"rxtx_quota": 0, "name": "m1.xlarge", "links": [{"href": "http://192.168.2.62:8774/v1.1/1/flavors/5", "rel": "self"}, {"href": "http://192.168.2.62:8774/1/flavors/5", "rel": "bookmark"}], "ram": 16384, "vcpus": 8, "rxtx_cap": 0, "swap": 0, "disk": 160, "id": 5}, {"rxtx_quota": 0, "name": "m1.small", "links": [{"href": "http://192.168.2.62:8774/v1.1/1/flavors/2", "rel": "self"}, {"href": "http://192.168.2.62:8774/1/flavors/2", "rel": "bookmark"}], "ram": 2048, "vcpus": 1, "rxtx_cap": 0, "swap": 0, "disk": 20, "id": 2}]}
{"flavors": [{"rxtx_quota": 0, "name": "m1.medium", "links": [{"href": "http://192.168.2.62:8774/v1.1/1/flavors/3", "rel": "self"}, {"href": "http://192.168.2.62:8774/1/flavors/3", "rel": "bookmark"}], "ram": 4096, "vcpus": 2, "rxtx_cap": 0, "swap": 0, "disk": 40, "id": 3}, {"rxtx_quota": 0, "name": "m1.large", "links": [{"href": "http://192.168.2.62:8774/v1.1/1/flavors/4", "rel": "self"}, {"href": "http://192.168.2.62:8774/1/flavors/4", "rel": "bookmark"}], "ram": 8192, "vcpus": 4, "rxtx_cap": 0, "swap": 0, "disk": 80, "id": 4}, {"rxtx_quota": 0, "name": "m1.xlarge", "links": [{"href": "http://192.168.2.62:8774/v1.1/1/flavors/5", "rel": "self"}, {"href": "http://192.168.2.62:8774/1/flavors/5", "rel": "bookmark"}], "ram": 16384, "vcpus": 8, "rxtx_cap": 0, "swap": 0, "disk": 160, "id": 5}, {"rxtx_quota": 0, "name": "m1.small", "links": [{"href": "http://192.168.2.62:8774/v1.1/1/flavors/2", "rel": "self"}, {"href": "http://192.168.2.62:8774/1/flavors/2", "rel": "bookmark"}], "ram": 2048, "vcpus": 1, "rxtx_cap": 0, "swap": 0, "disk": 20, "id": 2}]}




证明调用成功,如果想放到网页上展示,可以通过JSON的解析样式表来做。



     上面展示的只是REST的四个方法的GET方法,当然还有POST,PUT,DELETE三种方法,详细用法请参考官网的Jersey的API文

档。


只是展示了一个思路,希望对研究Openstack的朋友有所帮助。