Python Flask跨API调用后如何正确返回无转义JSON字符串
解决Flask API间调用返回JWT字符串的序列化与格式问题
我刚好碰到过类似的场景,两个Swagger生成的Flask服务互相调用,处理返回的JWT字符串时踩了同样的坑。先理清楚问题出在哪,再给你最直接的解决方案:
问题回顾
Server2的API2返回的是JWT编码后的字符串,但Server1调用后处理返回值时遇到两个麻烦:
- 直接返回
resp.content会触发Object of type 'bytes' is not JSON serializable错误,因为content是bytes类型,Flask无法直接序列化返回 - 用
resp.content.decode()转成字符串后,结果带了多余的转义双引号和换行符,变成"\"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9\"\n",不符合需求
先贴一下你的相关代码方便对照:
Server2的API2代码
def Server2_API2(): payload = { "value1": 'somedata', "value2": 'somedata', } encoded_payload = jwt.encode(payload, SECRET, algorithm=ALGORITHM) return encoded_payload # 返回字符串形式的JWT:'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.'
Server1的API1调用代码(原版本)
def Server1_API1(): resp = requests.post('http://localhost:1000/API2', data='value1=one&value2=two') if resp.status_code == 200: first_try = resp.content # 结果是b'"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9"\n' second_try = resp.content.decode() # 结果是'"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9" '(带换行符) return first_try # 报错;返回second_try则格式不对
完美解决方案
其实requests库已经帮我们封装了更省心的方法——resp.json(),一行代码就能解决所有问题:
修改后的Server1 API1代码
def Server1_API1(): resp = requests.post('http://localhost:1000/API2', data='value1=one&value2=two') if resp.status_code == 200: clean_jwt = resp.json() # 直接拿到纯净的JWT字符串:"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9" return clean_jwt
为什么这个方法有效?
因为Flask在返回字符串时,默认会把它包装成JSON响应(也就是给字符串加了双引号,并且以JSON格式返回)。resp.json()会自动完成:
- 将bytes类型的响应内容解码成字符串
- 解析JSON格式的内容,直接提取出原始的JWT字符串
- 自动去掉多余的转义符和换行符
这样返回的就是你需要的无报错、无多余符号的纯净JWT字符串了!
内容的提问来源于stack exchange,提问作者Harry Boy
相关产品推荐
相关产品推荐

