背景

最近在基于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

然后神奇的事情来了,上面的解码内容是
image
可以看到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)

此时我们再对编码后的字符进行解码
image
这时候就能得到正常的json结构了

评论

不吹不贬,python在开发一些小工具的时候确实很爽,因为api足够简单粗暴。但也正是因为这种简单,在做严肃的生产的功能的时候就显得很不严谨。因此也难怪有人将python称为是一种低代码.jpg