llcong 发表于 2015-4-12 16:22:12

OpenStack学习系列-----第二篇 由一个错误看理解整个架构的重要性

  看了openstack没几天,然后就开始试着用java调用所有的API,第一步得到Credentials的时候成功了,然后第二步,传参数使所有的server信息都列出来的时候报错404.具体描述如下(曾经发到论坛求助):
  最近搭建好openstack环境,测试API的时候出错,是404错误,涉及到的代码如下:









public static Map get(URL url, String token) throws IOException {
HttpURLConnection conn = getURLConnection(url);
//      conn.setRequestProperty("Content-Type", APPLICATION_JSON);
      conn.setRequestMethod(HTTP_GET);
conn.setDoInput(true);
//      conn.setDoOutput(true);
      if (token != null) {
System.out.println(token);
conn.setRequestProperty("X-Auth-Token", token);
}
System.out.println(conn.toString());
if (conn.getResponseCode() == 401) {
throw new IOException("Authorize Error occurs and the response code is :" + conn.getResponseCode() + ",and the message is:" + conn.getResponseMessage());
}
System.out.println(conn.getResponseCode());
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

//      System.out.println(mapper.readValue(conn.getInputStream(), new TypeReference() {}));
      
return mapper.readValue(conn.getInputStream(), new TypeReference() {
});

}
/**
* Creates the HTTP URL connection
*
* @param url
*            the URL to be used to establish HTTP connection
* @return A HttpURLConnection
*/
private static HttpURLConnection getURLConnection(URL url) throws IOException {
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// disable cache
      conn.setUseCaches(false);
// turn off HTTP keep-alive
      conn.setRequestProperty("Connection", "close");
return conn;
}






上面的参数URL 是:http://127.0.0.1:5000/v2/2835ba0b17384840941b5c5d653fb81a/servers/detail

报错如下:

Java code

Exception in thread "main" java.io.FileNotFoundException: http://127.0.0.1:5000/v2/2835ba0b17384840941b5c5d653fb81a/servers/detail
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1664)
at sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1662)
at java.security.AccessController.doPrivileged(Native Method)
at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1660)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1243)
at com.intel.cpa.openstack.HttpUtil.get(HttpUtil.java:148)
at com.intel.cpa.openstack.NovaAPI.listServers(NovaAPI.java:46)
at com.intel.cpa.openstack.NovaAPI.main(NovaAPI.java:37)
Caused by: java.io.FileNotFoundException: http://127.0.0.1:5000/v2/2835ba0b17384840941b5c5d653fb81a/servers/detail
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1613)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468)
at com.intel.cpa.openstack.HttpUtil.get(HttpUtil.java:137)
... 2 more







请问,这个是什么问题?有没有什么好的建议?

   

最终要的是发现404问题后思路应该什么样子的?

譬如这个,首先应该考虑构建的URL是否正确,然后这里还有一个要求是把一个值作为header传进去,也做了,请大家帮忙分析一下。

感谢您花时间思考!  
  


  


  多谢大家,已经解决了,确实是URL问题,主要原因是第一次请求后,第二次发送请求应该交由nova模块处理,所以应该换掉端口。
  


  


  主要问题在呢?第一次得到Credentials的时候,是去keystone,返回得到token,tenant等后,发送第二个请求,是应该去nova compute模块,所以,应该从第一次的返回值里面得到url,然后再发送请求。
  所以,还是要去了解openstack这个东西的整体架构。
  


   遇到404错误后,只是一遍一遍的看,没什么用,现在想想,要是分解开始去看应该会很快的找到原因了:
              1:http还是https
              2:主机地址对不对?
              3:端口对不对?(有时候调用不同的模块可能就会换新的端口)
              4:端口后面的内容
页: [1]
查看完整版本: OpenStack学习系列-----第二篇 由一个错误看理解整个架构的重要性