OpenStack学习系列-----第二篇 由一个错误看理解整个架构的重要性
看了openstack没几天,然后就开始试着用Java调用所有的API,第一步得到Credentials的时候成功了,然后第二步,传参数使所有的server信息都列出来的时候报错404.具体描述如下(曾经发到论坛求助):
最近搭建好openstack环境,测试API的时候出错,是404错误,涉及到的代码如下:
- public static Map<String, Object> 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<Map<String, Object>>() {}));
- return mapper.readValue(conn.getInputStream(), new TypeReference<Map<String, Object>>() {
- });
- }
- /**
- * 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:端口后面的内容
OpenStack学习系列-----第二篇 由一个错误看理解整个架构的重要性的更多相关文章
- JavaWeb学习总结第二篇--第一个JavaWeb程序
JavaWeb学习总结第二篇—第一个JavaWeb程序 最近我在学院工作室学习并加入到研究生的项目中,在学长学姐的带领下,进入项目实践中,为该项目实现一个框架(用已有框架进行改写).于是我在这里记录下 ...
- OpenStack学习系列-----第一篇 OpenStack介绍
刚开始接触OpenStack,被它所承诺的前景,以及现在业界对它的期望吸引(OpenStack被誉为21世纪的Linux开源社区,可以预见其的发展前景是何其广阔.).怎么说呢,我现在也暂时相信,Ope ...
- vue.js学习系列-第二篇
一 VUE实例生命周期钩子 1 生命周期函数 定义 生命周期函数就是vue在某一时间点自动执行的函数 2 具体函数 1 new vue() 2 before ...
- 学习KnockOut第二篇之Counter
学习KnockOut第二篇之Counter 欲看此 ...
- 深入理解javascript函数系列第二篇——函数参数
× 目录 [1]arguments [2]内部属性 [3]函数重载[4]参数传递 前面的话 javascript函数的参数与大多数其他语言的函数的参数有所不同.函数不介意传递进来多少个参数,也不在乎传 ...
- Caffe学习系列——工具篇:神经网络模型结构可视化
Caffe学习系列——工具篇:神经网络模型结构可视化 在Caffe中,目前有两种可视化prototxt格式网络结构的方法: 使用Netscope在线可视化 使用Caffe提供的draw_net.py ...
- 前端工程师技能之photoshop巧用系列第二篇——测量篇
× 目录 [1]测量信息 [2]实战 [3]注意事项 前面的话 前端工程师使用photoshop进行的大量工作实际上是测量.本文是photoshop巧用系列第二篇——测量篇 测量信息 在网页制作中需要 ...
- 深入理解javascript作用域系列第二篇——词法作用域和动态作用域
× 目录 [1]词法 [2]动态 前面的话 大多数时候,我们对作用域产生混乱的主要原因是分不清楚应该按照函数位置的嵌套顺序,还是按照函数的调用顺序进行变量查找.再加上this机制的干扰,使得变量查找极 ...
- RabbitMQ学习总结 第二篇:快速入门HelloWorld
目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...
随机推荐
- 26.68013 烧录方式 及iic生成
硬件程序烧录 1)因为本产品要求将二进制代码和硬件PID/VID烧录在EEPROM,而不是使用CYPRESS推荐的在线下载方式,所以外部采用了8K的EEPROM.上电后68013A会将EEPROM中的 ...
- iOS 进阶 第二十一天(0531)
0531 - Autolayout 不仅可以做屏幕适配还可以做系统适配 uidynamic 做物理动画.能做的效果如下图: Autolayout Autolayout 是一种“自动布局”技术,专门用来 ...
- 项目中添加Log4J支持
首先,在项目中的classes 中新建立一个log4j.properties文件即可: 在实际编程时,要使Log4j真正在系统中运行事先还要对配置文件进行定义.定义步骤就是对Logger.Append ...
- Google Guava学习笔记——基础工具类Splitter的使用
另一项经常对字符串的操作就是根据指定的分隔符对字符串进行分隔.我们基本上会使用String.split方法: String testString = "Monday,Tuesday,,Thu ...
- SGU 185 Two shortest 最短路+最大流
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21068 Yesterday Vasya and Petya qua ...
- sql records
DROP TABLE IF EXISTS student; CREATE TABLE student ( id INT NOT NULL AUTO_INCREMENT, student_name ) ...
- color mask
https://msdn.microsoft.com/zh-cn/library/windows/desktop/bb173595(v=vs.85).aspx void OMSetBlendState ...
- 研究Dropbox Server端文件系统
一.传统文件系统 可以理解成两部分:1.真正的storage区,被分割成n个扇区:2.文件系统,其实就是一个FAT表. 二.Dropbox的文件系统 例如,一个modeo.mov的文件,大小为15M. ...
- 在C#中调用VBScript和JavaScript等脚本的实现
在C#中调用VBScript.JavaScript等脚本的实现 作者:郑佐 2004-04-26 以前在做工作流(workflow)项目的时候,里面有一项就是在用户制定流程定义时可以编写脚本来控制活动 ...
- Hello world,Hello 2015,Bye 2014
序 在我写下“在”这个字的时候已经是2014-12-31 19:59,14年最后一天了,总觉得不写点东西祭奠一下那些被自己虐死的脑细胞,心里就不舒服. 那就从生活,工作,学习三个方面,总结一下吧. 生 ...