如何用Python Requests突破URL长度限制?Web.py跨应用传长JSON
解决基于web.py的两个应用间超长JSON传输异常问题
你遇到的问题大概率是GET请求的URL长度限制和未编码的JSON特殊字符导致的——30000-40000字符的JSON直接塞进URL参数,完全超出了大部分服务器对GET请求URL的默认长度限制,而且JSON里的&、=、空格这类字符会被URL解析器当成参数分隔符,直接破坏JSON结构。
给你两个靠谱的解决方案,优先推荐第一个:
方案一:改用POST请求传输JSON(最稳妥)
POST请求的请求体没有严格的长度限制(只要服务器配置允许),而且不用处理URL编码的麻烦,是传输大量数据的标准方式。
发送端修改代码:
把requests.get改成requests.post,并将JSON放在请求体中(requests会自动帮你设置正确的Content-Type并处理编码):
import requests template = <长JSON字符串> url = 'http://0.0.0.0:6060/api/getPpt' # 用json参数直接传入,requests会自动序列化并设置Content-Type: application/json resp = requests.post(url, json=template).text
接收端web.py代码调整:
修改接口为POST方法,从请求体中读取JSON数据:
import web import json urls = ( '/api/getPpt', 'GetPptHandler' ) class GetPptHandler: def POST(self): # 读取请求体中的原始数据并解析为JSON raw_data = web.data() try: template = json.loads(raw_data) # 这里写你的PPT生成逻辑 # ... return json.dumps({"status": "success", "message": "PPT生成中"}) except json.JSONDecodeError: return json.dumps({"status": "error", "message": "JSON格式错误"}) if __name__ == "__main__": app = web.application(urls, globals()) app.run()
方案二:如果必须用GET(不推荐)
如果因为某些原因必须用GET,你需要做两件事:
- 对JSON字符串做URL编码,避免特殊字符破坏URL结构
- 调整接收端web.py服务器的配置,允许更长的URL
发送端修改代码:
import requests import urllib.parse template = <长JSON字符串> # 对JSON做URL编码 encoded_template = urllib.parse.quote(template) url = f'http://0.0.0.0:6060/api/getPpt?template={encoded_template}' resp = requests.get(url).text
接收端调整:
- 首先要解码URL参数:
class GetPptHandler: def GET(self): params = web.input() # 解码URL编码的JSON字符串 template = urllib.parse.unquote(params.template) try: template_json = json.loads(template) # 处理逻辑... except json.JSONDecodeError: # 错误处理...
- 然后需要调整web.py的服务器配置(比如用内置的wsgiserver时,设置
max_request_line),或者如果用nginx反向代理,也要调整client_max_body_size和large_client_header_buffers等参数,否则超长URL会被截断。
但还是强烈建议用POST,GET本来就不是为传输大量数据设计的,后续维护和兼容性都会有问题。
内容的提问来源于stack exchange,提问作者Ludo
相关产品推荐
相关产品推荐

