Greasemonkey POST提交JSON数据时浮点数小数点被替换为下划线问题求助
问题根因
- 核心错误为请求头声明的载荷格式与实际提交的载荷格式不匹配:你将JSON序列化后的字符串作为请求体提交,但请求头的
Content-Type配置为application/x-www-form-urlencoded,后端会按照表单键值对的规则解析JSON字符串,直接触发你遇到的所有异常。 - 三个异常的具体触发逻辑:后端会把整段JSON字符串识别为表单的第一个键名,没有对应值;部分服务端中间件会自动对表单键名做HTML实体编码、同时把键名中的特殊字符(小数点)替换为下划线,完全符合你反馈的现象。
- GM.xmlHttpRequest的
data参数仅支持字符串、FormData、Blob类型的入参,直接传入普通对象、数组会被自动转为[object Object]这类无效内容,必须提前做序列化处理,额外添加非官方支持的dataType参数不会生效。
解决方案
方案1:提交JSON格式载荷
如果后端支持接收JSON类型的请求数据,直接修改Content-Type为JSON对应类型即可:
let jsonString = JSON.stringify(json); GM.xmlHttpRequest({ method: "POST", url: "https://exampleau.tld", data: jsonString, headers: { "Content-Type": "application/json; charset=utf-8" }, onload: function(response) { // 业务逻辑 } });
该方案下后端直接解析原始请求体即可获取完整的JSON结构,不会出现转义、字符替换等异常。
方案2:提交表单格式载荷
如果后端仅支持application/x-www-form-urlencoded格式的请求,需要先把JSON对象转换为表单键值对格式的字符串再提交:
// 将JSON对象转为表单格式字符串 const formDataStr = new URLSearchParams(json).toString(); GM.xmlHttpRequest({ method: "POST", url: "https://exampleau.tld", data: formDataStr, headers: { "Content-Type": "application/x-www-form-urlencoded; charset=utf-8" }, onload: function(response) { // 业务逻辑 } });
内容的提问来源于stack exchange,提问作者Roman K.
相关产品推荐
相关产品推荐

