You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何让Python Requests提交latin-1编码的JSON数据?

解决方法:让Requests以latin-1编码提交JSON

当然可以搞定这个问题!核心原因是Requests默认会用UTF-8编码JSON数据,但你的目标服务依赖Latin-1编码的输入,且没有做编码转换处理,所以我们需要绕过Requests的自动JSON处理流程,手动控制编码步骤。

具体操作步骤如下:

  1. 手动生成JSON字符串并编码为Latin-1字节
    先用json.dumps()把Python字典转换成JSON格式的字符串,再直接用latin-1编码成字节数据。这里要注意:如果你的字符串包含Latin-1字符集之外的字符(比如中文“莽”),直接编码会抛出UnicodeEncodeError——这时候你可以用errors='replace'参数替换无法编码的字符,或者如果服务实际接受的是GBK等其他编码(只是表排序规则设为Latin-1),可以先转成对应编码再包装成Latin-1字节(这一步需要你确认服务的实际处理逻辑)。

  2. 设置正确的请求头
    因为我们不用requests.post()json参数,而是用data参数提交字节数据,所以需要手动设置Content-Type头为application/json; charset=latin-1,明确告诉服务我们发送的是Latin-1编码的JSON数据。

代码示例

import json
import requests

# 你的原始数据
payload = {'Key': '莽'}

# 1. 生成JSON字符串
json_str = json.dumps(payload)

# 2. 编码为Latin-1字节(用replace处理无法编码的字符,可根据实际情况调整)
json_bytes = json_str.encode('latin-1', errors='replace')

# 3. 发送请求
url = "你的目标Web服务URL"
headers = {'Content-Type': 'application/json; charset=latin-1'}
response = requests.post(url, data=json_bytes, headers=headers)

补充说明

  • 为什么不用json参数?因为当你使用json参数时,Requests内部会强制用UTF-8编码JSON数据,并且自动设置Content-Type: application/json(不带charset参数),无法直接指定Latin-1编码。
  • 如果“莽”这类中文字符必须正确存储,那可能你的服务实际期望的不是Latin-1编码,而是GBK或GB2312(毕竟Latin-1本身不支持中文)。这种情况下,你可以先把中文转成GBK字节,再把这些字节当成Latin-1字符串来生成JSON:
    # 示例:把中文转成GBK字节,再包装成Latin-1兼容字符串
    chinese_str = '莽'
    gbk_bytes = chinese_str.encode('gbk')
    # 将GBK字节解码为Latin-1字符串,确保能被Latin-1编码
    latin1_compatible_str = gbk_bytes.decode('latin-1')
    payload = {'Key': latin1_compatible_str}
    json_str = json.dumps(payload)
    json_bytes = json_str.encode('latin-1')
    # 发送请求,headers设置同上
    
    这样服务收到Latin-1编码的JSON后,存储到Latin-1表中,后续读出来时用GBK解码就能得到正确的中文。

内容的提问来源于stack exchange,提问作者neves

火山引擎 最新活动