OpenStack 之 Curl 使用
目录
OpenStack 之 Curl 使用 .................................................................................................................... 1
一、openstack keystone api 之 curl ........................................................................................ 1
二、使用 curl 来调试应用 ....................................................................................................... 3
三、使用 cURL 操作 Swift 的 ReST API ................................................................................... 6
四、后语 ................................................................................................................................. 10
一、openstack keystone api 之 curl
1、重要概念:
Admin Token
所有服务共享的一个密钥,如果设置不同,哪些依赖 keystone 的服务将无法正
常工作。
Tenants
做 keystone 里,Tenants 是一个高层次的组,表示一组用户。一个 tenant 是一
个小组,共同拥有 Nova 里的虚拟机,或者 Swift 里的容器。一个 tenant 可以有
一个或者多个用户,用户可以属于一个或者多个 tenant,针对每个 tenant,用户
拥有一个角色(role)。
Tenants are the high level grouping within Keystone that represent groups of users. A
tenant is the grouping that owns virtual machines within Nova, or containers within
Swift. A tenant can have zero or more users, Users can be associated with more than
one tenant, and each tenant – user pairing can have a role associated with it.
认证几个要素:tenants, users, roles
业务端口:5000
管理端口:35357
2、业务 API 测试:
获取版本号:
curl http://0.0.0.0:5000/ | python -mjson.tool
curl http://0.0.0.0:5000/v2.0/ | python -mjson.tool
获取 api 扩展:
curl http://0.0.0.0:5000/v2.0/extensions | python -mjson.tool
“ X-Auth-Token:614be856b02449439b116c0b28e94217 ″
用普通用户登录:
curl -X POST -d ‘{“auth”: {“passwordCredentials”:{“username”: “admin”, “password”:
“nova”}}}’ -H “Content-type: application/json” http://0.0.0.0:5000/v2.0/tokens |
python -mjson.tool
查看自己的租户:
curl
http://0.0.0.0:5000/v2.0/tenants | python -mjson.tool
3、管理 API 测试:
获取版本号:
curl http://0.0.0.0:35357/ | python -mjson.tool
curl http://0.0.0.0:35357/v2.0/ | python -mjson.tool
获取 api 扩展:
curl http://0.0.0.0:35357/v2.0/extensions | python -mjson.tool
用角色 admin 登录:
curl -X POST -d ‘{“auth”: {“tenantId”: “6a524dbe23dd4e4ab672cd163c85a27d”,
“passwordCredentials”:{“username”:
-H
“Content-type: application/json” http://0.0.0.0:35357/v2.0/tokens
| python
-mjson.tool
校验 token 的有效,并返回 token 的信息:
curl
http://0.0.0.0:35357/v2.0/tokens/82c8d77cac0a4fdba83b2191185ddb39
-mjson.tool
使用 HEAD 校验,如果返回码是 20X, 表示 token 有效:
curl
http://0.0.0.0:35357/v2.0/tokens/5a10b008add4435f8473d2b11d3ba8a8
这个 api 不对:
“ X-Auth-Token:5a10b008add4435f8473d2b11d3ba8a8 ″
curl
http://0.0.0.0:35357/v2.0/tokens/5a10b008add4435f8473d2b11d3ba8a8/endpoints
返回租户:
curl
-H
http://0.0.0.0:35357/v2.0/tenants|python -mjson.tool
返回某个租户:
32efbc8c22af4ad6a8f03d051dc3413b”
|python
“ X-Auth-Token:5a10b008add4435f8473d2b11d3ba8a8 ″
“admin”,
“password”:
“nova”}}}’
“X-Auth-Token:
-I
-H “ X-Auth-Token:
5a10b008add4435f8473d2b11d3ba8a8 ″
-H
-H
-H
-H
-H
-H
-H
“ X-Auth-Token:5a10b008add4435f8473d2b11d3ba8a8 ″
“ X-Auth-Token:5a10b008add4435f8473d2b11d3ba8a8 ″
“ X-Auth-Token:5a10b008add4435f8473d2b11d3ba8a8 ″
curl
http://0.0.0.0:35357/v2.0/tenants/6a524dbe23dd4e4ab672cd163c85a27d |python
-mjson.tool
返回用户:
curl
-H
http://0.0.0.0:35357/v2.0/users|python -mjson.tool
返回某个用户:
curl
http://0.0.0.0:35357/v2.0/users/3ff8fbca9794436c996d8c6e41427530|python
-mjson.tool
返回某个租户上,用户授予的角色:
“ X-Auth-Token:5a10b008add4435f8473d2b11d3ba8a8 ″
curl
http://0.0.0.0:35357/v2.0/tenants/6a524dbe23dd4e4ab672cd163c85a27d/users/3ff
8fbca9794436c996d8c6e41427530/roles |python -mjson.tool
返 回 某 个 用 户 的 角 色 : ( 出 错 , 没 有 实 现 , 参 见
https://bugs.launchpad.net/keystone/+bug/933565)
curl
http://0.0.0.0:35357/v2.0/users/3ff8fbca9794436c996d8c6e41427530/roles
“ X-Auth-Token:5a10b008add4435f8473d2b11d3ba8a8 ″
二、使用 curl 来调试应用
我们在客户端开发过程中总免不了和后端进行 api 对接,有时候需要对返回的数
据格式进行调试,有时候每次运行客户端来发送请求,这个未免效率太低,这里
就来介绍一个好用的工具–curl。
curl
curl 是一个向服务器传输数据的工具,它支持 http、https、ftp、ftps、scp、sftp、
tftp、telnet 等协议,这里只针对 http 进行讲解一些常用的用法,具体安装请自
行搜索。
打开百度
curl http://www.baidu.com
接着你就会看到百度的页面源代码输出。
如果要把这个网页保存下来,可以这样:
curl http://www.baidu.com > /tmp/baidu.html
你会看到一条进度条,然后源码就被重定向到了/tmp/baidu.html。
或者:
curl -o /tmp/baidu.html http://www.baidu.com
GET 请求
默认直接请求一个 url 就是发出一个 get 请求,参数的话直接拼接在 url 里就好了,
如
curl http://www.baidu.com/s?wd=curl
上述请求会上百度发起一条查询请求,参数是 wd=url
POST 请求
curl -d "name=test&page=1" http://www.baidu.com
-d 参数指定表单以 POST 的形式执行。
只展示 Header
curl -I http://www.baidu.com
可以看到只返回一些 header 信息
HTTP/1.1 200 OK
Date: Fri, 07 Nov 2014 09:48:58 GMT
Content-Type: text/html; charset=utf-8
Connection: Keep-Alive
Vary: Accept-Encoding
Set-Cookie: BAIDUID=E9DB2F0AC95CB6BFDAD9D5CFDCED0A12:FG=1; expires=Thu,
31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BAIDUPSID=E9DB2F0AC95CB6BFDAD9D5CFDCED0A12;
31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: BD_HOME=0; path=/
Set-Cookie:
H_PS_PSSID=9725_9165_1465_7800_9452_9498_6504_9509_6018_9700_9757_95
31_9478_7798_9453_9793_9024; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Cache-Control: private
Cxy_all: baidu+3057b288b211c770a1463cc8519b62a8
Expires: Fri, 07 Nov 2014 09:48:17 GMT
X-Powered-By: HPHP
Server: BWS/1.1
BDPAGETYPE: 1
BDQID: 0xfa28eff900012706
BDUSERID: 0
显示通信过程
-v 参数可以显示一次 http 通信的整个过程,包括端口连接和 http request 头信息
expires=Thu,
curl -v www.baidu.com
* Adding handle: conn: 0x7ffe4b003a00
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x7ffe4b003a00) send_pipe: 1, recv_pipe: 0
* About to connect() to www.baidu.com port 80 (#0)
* Trying 61.135.169.125...
* Connected to www.baidu.com (61.135.169.125) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.30.0
> Host: www.baidu.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Fri, 07 Nov 2014 09:49:49 GMT
< Content-Type: text/html; charset=utf-8
< Transfer-Encoding: chunked
< Connection: Keep-Alive
< Vary: Accept-Encoding
< Set-Cookie: BAIDUID=062E02D23FBB651CF8455B699DF02B64:FG=1; expires=Thu,
31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
< Set-Cookie: BAIDUPSID=062E02D23FBB651CF8455B699DF02B64; expires=Thu,
31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
< Set-Cookie: BDSVRTM=0; path=/
< Set-Cookie: BD_HOME=0; path=/
<
H_PS_PSSID=7744_1429_7801_9583_9499_6506_6018_9769_9699_9757_9532_94
77_7799_9453_9716_9023; path=/; domain=.baidu.com
< P3P: CP=" OTI DSP COR IVA OUR IND COM "
< Cache-Control: private
< Cxy_all: baidu+7dcb6b3c03d32c334d42f311919a14d6
< Expires: Fri, 07 Nov 2014 09:49:20 GMT
< X-Powered-By: HPHP
* Server BWS/1.1 is not blacklisted
< Server: BWS/1.1
< BDPAGETYPE: 1
< BDQID: 0xadb706860000088f
< BDUSERID: 0
如果你觉得上面的信息还不够,那么下面的命令可以查看更详细的通信过程。
Set-Cookie:
curl --trace output.txt www.baidu.com
或者
curl --trace-ascii output.txt www.baidu.com
运行后,请打开 output.txt 文件查看。
HTTP 方法
curl 默认的 HTTP 方法是 GET,使用-X 参数可以支持其他动词。
curl -X POST www.example.com
curl -X DELETE www.example.com
Referer 字段
有时你需要在 http request 头信息中,提供一个 referer 字段,表示你是从哪里跳
转过来的。
curl --referer http://www.example.com http://www.example.com
User Agent 字段
这个字段是用来表示客户端的设备信息。服务器有时会根据这个字段,针对不同
设备,返回不同格式的网页,比如手机版和桌面版。
iPhone4 的 User Agent 是
Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9
(KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7
curl 可以这样模拟:
curl --user-agent "[User Agent]" [URL]
增加头信息
有时需要在 http request 之中,自行增加一个头信息。–header 参数就可以起到
这个作用。
curl --header "Content-Type:application/json" http://example.com
本文档转载自:
http://stormzhang.com/devtools/2014/11/07/use-curl-debug/
三、使用 cURL 操作 Swift 的 ReST API
cURL 是一个利用 URL 语法规定来传输文件和数据的工具,支持很多协议,
如 HTTP、FTP、TELNET 等。本文主要是介绍使用该工具和 HTTP 协议与 swift 服
-D-
-H
test:tester'
-H
'X-Storage-Pass:
testing'
'X-Storage-User:
-X METHOD 描述 HTTP 的请求方法(HEAD, GET 等)
-D Dump 将 HTTP 响应头部到 stdout.
-H HEADER 描述一个在请求中的 HTTP\HTTPS 头部
务如何交互。cURL 允许你从命令行或 shell 脚本传送和接收 HTTP 的请求和响应。
这使得直接与 ReST 的 API 工作而无需其他客服端 APIs 成为可能。本文,我们需
要使用到以下的 cURL 命令行选项:
-v 使用操作的过程更加详细
1.认证
为了使用 ReST 的 API,我们首先需要获得一个认证令牌,用于传给每个使用
X-Auth-Token 头部的请求。以下的例子展示了如何使用 cURL 来获得认证令牌和
存储系统的 URL。
Exp1:获得 X-Storage-Url 和 X-Auth-Token
curl
http://127.0.0.1:8080/auth/v1.0
运行结果如下:
sting' http://127.0.0.1:8080/auth/v1.0
HTTP/1.1 200 OK
X-Storage-Url: http://127.0.0.1:8080/v1/AUTH_test
X-Storage-Token: AUTH_tkf828cc87bb9348168a52619b1f7e3928
X-Auth-Token: AUTH_tkf828cc87bb9348168a52619b1f7e3928
Content-Length: 0
Date: Fri, 07 Oct 2011 07:45:58 GMT
也可以使用-v 选项来获得更详细的信息:
curl
http://127.0.0.1:8080/auth/v1.0
运行结果如下:
* About to connect() to 127.0.0.1 port 8080 (#0)
* Trying 127.0.0.1... connected
* Connected to 127.0.0.1 (127.0.0.1) port 8080 (#0)
> GET /auth/v1.0 HTTP/1.1
> User-Agent: curl/7.21.3
zlib/1.2.3.4 libidn/1.18
> Host: 127.0.0.1:8080
> Accept: */*
> X-Storage-User: test:tester
> X-Storage-Pass: testing
>
(i686-pc-linux-gnu)
libcurl/7.21.3 OpenSSL/0.9.8o
'X-Storage-User:
'X-Storage-Pass:
-v
-H
test:tester'
-H
testing'
< HTTP/1.1 200 OK
< X-Storage-Url: http://127.0.0.1:8080/v1/AUTH_test
< X-Storage-Token: AUTH_tkf828cc87bb9348168a52619b1f7e3928
< X-Auth-Token: AUTH_tkf828cc87bb9348168a52619b1f7e3928
< Content-Length: 0
< Date: Fri, 07 Oct 2011 07:48:30 GMT
<
* Connection #0 to host 127.0.0.1 left intact
* Closing connection #0
存储 URL 和认证令牌作为响应头部返回。在认证之后,你可以使用 cURL
来执行存储服务上的 HEAD,GET,DELETE,POST 和 PUT 请求。
2.确定存储的使用情况
一个 HEAD 请求可以发送到存储服务来确定你已经在系统中存储了多少数据以及
你使用的容器数量。使用-X 开关来描述正确的 HTTP 方法和-D 将 HTTP 响应头部
输出到终端(stdout)。
Exp2:查询帐号的存储使用情况
curl -X HEAD -D - \
-H "X-Auth-Token:AUTH_tkf828cc87bb9348168a52619b1f7e3928" \
http://127.0.0.1:8080/v1/AUTH_test
输出如下:
HTTP/1.1 204 No Content
X-Account-Object-Count: 3
X-Account-Bytes-Used: 92983
X-Account-Container-Count: 4
Accept-Ranges: bytes
Content-Length: 0
Date: Fri, 07 Oct 2011 08:04:38 GMT
HTTP 请求必须包含了一个头部来描述认证令牌。在响应中的 HTTP 头部显示在该
存储帐号中的容器数量和整个帐号所存储的总字节数。
3.创建一个存储容器
在上传任何数据到 OpenStack 的对象存储之前,你必须创建一个存储容器。
你可以使用 PUT 请求来创建一个容器;cURL 也可以用于该目的。
Exp3:创建一个 photos 的容器
curl -X PUT -D - -H "X-Auth-Token:AUTH_tkf828cc87bb9348168a52619b1f7e3928"