背景
最近在基于dolphinscheduler(海豚调度器,以下简称DS)做二次开发。由于是个纯ETL团队,技术栈中并没有关于java的储备。因此需要是python实现相关的接口开发。
关于x-www-form-urlencoded
这是一种神奇数据格式,我在这里并不纠结其背后的使用规范,只需要知道使用这种content-type的话需要对body的内容体进行urlencode。
抽象的python的urlencode
于是笔者在网上找相关代码案例,找到一个挺优雅的实现
from urllib.parse import urlencode
text={'name':'mugun'}
encoder=urlencode(text)
print(encoder)
## name=mugun
看样子还挺靠谱? 那我们将内容变得复杂一点
from urllib.parse import urlencode
text={'name':'mugun','hobby':['bike','car','computer']}
encoder=urlencode(text)
print(encoder)
## name=mugun&hobby=%5B%27bike%27%2C+%27car%27%2C+%27computer%27%5D
然后神奇的事情来了,上面的解码内容是
可以看到hobby对应的内容并不一个正常的json格式,那这就很蛋疼了。。
解决方案
上述的那个只能处理字典集合类型,不能处理字符串,而我们可以看到这个上面的方法主要是对复杂类型的处理有问题,因此我们需要做一下加工
import json
import urllib.parse
text={'name':'mugun','hobby':['bike','car','+compute']}
for i in text:
if isinstance(text[i],tuple) or isinstance(text[i],dict) or isinstance(text[i],list):
text[i]=json.dumps(text[i],ensure_ascii=False)
encoder=urllib.parse.urlencode(text).replace("+",'')
print(encoder)
此时我们再对编码后的字符进行解码
这时候就能得到正常的json结构了
评论
不吹不贬,python在开发一些小工具的时候确实很爽,因为api足够简单粗暴。但也正是因为这种简单,在做严肃的生产的功能的时候就显得很不严谨。因此也难怪有人将python称为是一种低代码.jpg