python参数报错_python对所有需要post到url的参数进行json.dumps,再进行urlencode报错...

最近在搞设备自动上架的事情,需要拿到自动上架的接口,以及需要传的参数有哪些?于是直接从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这种形式的.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值