最近在搞设备自动上架的事情,需要拿到自动上架的接口,以及需要传的参数有哪些?于是直接从oss的网页来观察调用了哪个接口.
1、鼠标右键->检查->Network(也可以直接F12):
2、进行设备上架:
3、“提交”之后,观察Network一栏出现的url,点进去,如下:
其中Headers里面的Request URL: http://xxx 就是设备上架的接口,而Request
Payload就是需要传的参数.
现在我贴出文本内容来:
Request
URL:http://xxx.xxx.xxx.xxx:8080/cdb2/fun_logic/cgi-bin/dev/install_raw_dev.cgi
Request Method:POST
Status Code:200 OK
Remote Address:xxx.xxx.xxx.xxx:8080
Referrer Policy:no-referrer-when-downgrade
------WebKitFormBoundary75oVWtndErMYDu3X
Content-Disposition: form-data; name="xtype"
normal
------WebKitFormBoundary75oVWtndErMYDu3X
Content-Disposition: form-data; name="mactype"
common
------WebKitFormBoundary75oVWtndErMYDu3X
Content-Disposition: form-data; name="depotid"
147
------WebKitFormBoundary75oVWtndErMYDu3X
Content-Disposition: form-data; name="appplatform"
------WebKitFormBoundary75oVWtndErMYDu3X
Content-Disposition: form-data; name="cgroup_hidden"
YES
------WebKitFormBoundary75oVWtndErMYDu3X
Content-Disposition: form-data; name="cluster_id"
22
------WebKitFormBoundary75oVWtndErMYDu3X
Content-Disposition: form-data; name="dev_list"
[
{
"master": {
"app_platform": "qcloud",
"cdb_class": "cdb2.0",
"data_dir": "/data1",
"dev_ip":
"xxx.xxx.xxx.xxx",
"dev_os":
"tlinux",
"idc_parent_name": "广州移动三水AC",
"inner_switch_ip":
"xxx.xxx.xxx.xxx;xxx.xxx.xxx.xxx",
"real_idc_parent_name": "广州移动三水AC",
"server_idc": "广州移动三水AC2楼0203",
"server_rack": "203-F09"
},
"slave": {
"app_platform": "qcloud",
"cdb_class": "cdb2.0",
"data_dir": "/data1",
"dev_ip":
"xxx.xxx.xxx.xxx",
"dev_os":
"tlinux",
"idc_parent_name": "广州移动三水AC",
"inner_switch_ip":
"xxx.xxx.xxx.xxx;xxx.xxx.xxx.xxx",
"real_idc_parent_name": "",
"server_idc": "广州移动三水AC3楼0302",
"server_rack": "0302-B15"
}
}
]
------WebKitFormBoundary75oVWtndErMYDu3X
Content-Disposition: form-data; name="datadir"
/data1
------WebKitFormBoundary75oVWtndErMYDu3X
Content-Disposition: form-data; name="author"
vivaxiao
从这些信息出可以提取出来,设备上架调用的接口为:
http://xxx.xxx.xxx.xxx:8080/cdb2/fun_logic/cgi-bin/dev/install_raw_dev.cgi
需要传的参数为:
xtype=“normal”
mactype= “common”
depotid=147
appplatform=""
cgroup_hidden=YES
cluster_id=22
dev_list=[
{
"master": {
"app_platform": "qcloud",
"cdb_class": "cdb2.0",
"data_dir": "/data1",
"dev_ip":
"xxx.xxx.xxx.xxx",
"dev_os":
"tlinux",
"idc_parent_name": "广州移动三水AC",
"inner_switch_ip":
"xxx.xxx.xxx.xxx;xxx.xxx.xxx.xxx",
"real_idc_parent_name": "广州移动三水AC",
"server_idc": "广州移动三水AC2楼0203",
"server_rack": "203-F09"
},
"slave": {
"app_platform": "qcloud",
"cdb_class": "cdb2.0",
"data_dir": "/data1",
"dev_ip":
"xxx.xxx.xxx.xxx",
"dev_os":
"tlinux",
"idc_parent_name": "广州移动三水AC",
"inner_switch_ip":
"xxx.xxx.xxx.xxx;xxx.xxx.xxx.xxx",
"real_idc_parent_name": "",
"server_idc": "广州移动三水AC3楼0302",
"server_rack": "0302-B15"
}
}
]
datadir="/data1"
author="vivaxiao"
由Request Method:POST ,可以知道传参数的方式是post.
第一反应肯定是,先把所有需要post的参数拼接起来,然后转成json,再post到url,代码如下:
post_data =
{"xtype":"normal","mactype":"common","depotid":depot_id,"appplatform":"","cgroup_hidden":"YES","cluster_id":cluster_id,"dev_list":dev_list,"datadir":datadir,"author":"vivaxiao"}
url =
'http://xxx.xxx.xxx.xxx:8080/cdb2/fun_logic/cgi-bin/dev/install_raw_dev.cgi'
data = json.dumps(post_data,ensure_ascii=False)
print data
这样会出现报错:
data = urllib.urlencode(data)
File "/usr/lib64/python2.6/urllib.py", line 1267, in
urlencode
raise TypeError
TypeError: not a valid non-string sequence or mapping
object
urlencode的时候报错了,为什么会报错呢?
原因是:
json.dumps() returns a string.
urllib.urlencode() expects a query in the format of a mapping
object or tuples. Note that it does not expect a
string.
直接对所有需要post的参数进行json.dumps,返回的是string,而urlencode()
不能对string进行编码,只能对key:value的形式进行编码,故出现报错!
问题又来了,为什么需要进行urlencode呢?
因为url是没办法识别如:中文、双引号、逗号等一些特殊字符,所以需要对这些特殊字符进行编码.
dev_list这个key,它的value是有中文、双引号、逗号的,所以需要进行urlencode.
那么正确的代码是怎么样的呢?如下:
dev_list =
json.dumps(dev_list,ensure_ascii=False)
post_data =
{"xtype":"normal","mactype":"common","depotid":depot_id,"appplatform":"","cgroup_hidden":"YES","cluster_id":cluster_id,"dev_list":dev_list,"datadir":datadir,"author":"vivaxiao"}
url =
'http://xxx.xxx.xxx.xxx:8080/cdb2/fun_logic/cgi-bin/dev/install_raw_dev.cgi'
data = urllib.urlencode(post_data)
print data
只对dev_list
的value进行json.dumps转换成json数据,然后和其他需要post的参数进行拼接,然后进行urlencode .
由于urlencode的对象不是一个string,是key:value形式的,所以不会出现报错.
urlencode之后,打印出来的data为:
就是形如:a=1&b=2&c=3这种形式的.