无需使用内容或Content-Type标头,验证x-www-form-urlencoded字符串并区分JSON字符串的技术咨询
关于x-www-form-urlencoded与JSON字符串的验证和区分问题
先提一句你给出的JSON验证代码:其实这段代码有个小问题——如果jsonstring本身就是字符串类型,json.dumps(jsonstring)会把它转义成带引号的字符串(比如'{"a":1}'会变成'"{\\"a\\":1}"'),之后json.loads解析的是这个转义后的字符串,根本不是在验证原始JSON的合法性。正确的JSON验证应该直接用json.loads并捕获异常,比如:
import json def is_valid_json(s): try: json.loads(s) return True except json.JSONDecodeError: return False
接下来咱们逐个解决你的两个需求:
需求1:验证x-www-form-urlencoded字符串(不依赖Content-Type标头或业务内容)
首先得明确:完全不看字符串内容的话根本没法验证格式,这里应该是指不依赖业务层面的键值规则,只从编码格式上验证对吧?
x-www-form-urlencoded的核心格式规则是:由&分隔键值对,每个键值对通常是key=value的形式(标准允许只有key没有value的情况,比如key&key2=val),且键和值都经过URL编码。
你可以用Python的urllib.parse模块来实现验证,思路是尝试解析字符串并验证编码合法性:
from urllib.parse import parse_qs def is_valid_form_urlencoded(s): # 空字符串视为合法(对应空表单提交) if not s: return True # 拆分所有键值对,排除空项(比如末尾多余的&) pairs = [p for p in s.split('&') if p] # 尝试解析并验证URL编码的合法性 try: parsed = parse_qs(s) # 解码所有键和值,确保是合法的UTF-8 URL编码内容 for key, values in parsed.items(): key.encode('utf-8').decode('utf-8') for val in values: val.encode('utf-8').decode('utf-8') # 如果需要严格验证每个键值对都有=,可以取消下面的注释 # for pair in pairs: # if '=' not in pair: # return False return True except (UnicodeDecodeError, ValueError): return False
需求2:区分JSON与x-www-form-urlencoded字符串(不依赖业务内容、键检查或Content-Type)
两者的格式特征有明显差异,咱们可以基于这些特征来区分:
- 标准JSON的顶级结构只能是对象或数组,所以必然以
{或[开头,以}或]结尾 - x-www-form-urlencoded字符串通常包含
&或=,且不会以{/[开头(除非是恶意构造的特殊情况,这时候需要结合解析验证)
实现代码如下:
import json from urllib.parse import parse_qs def distinguish_json_or_form(s): stripped_s = s.strip() if not stripped_s: return "无法区分(空字符串)" # 先判断是否符合JSON的格式特征并验证 if stripped_s.startswith(('{', '[')) and stripped_s.endswith(('}', ']')): try: json.loads(stripped_s) return "JSON字符串" except json.JSONDecodeError: pass # 再判断是否符合x-www-form-urlencoded的格式 try: parsed = parse_qs(stripped_s) # 解析成功,或字符串包含&/=,则判定为表单编码字符串 if parsed or '&' in stripped_s or '=' in stripped_s: return "x-www-form-urlencoded字符串" except: pass # 都不符合的情况 return "无法识别的字符串类型"
这个方法完全基于字符串的格式特征,不需要依赖任何外部标头或业务内容,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者Skynet
相关产品推荐
相关产品推荐

