You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java/JSON POST请求中转义字符处理报错如何解决?

问题根因

两次报错的核心原因分别是shell引号规则冲突、JSON语法不规范:

  • 第一次报错:你使用单引号包裹整个POST的JSON参数,shell语法中单引号包裹的字符串内不允许直接出现单引号,SQL里的'2021-02-11'的第一个单引号直接提前闭合了shell的外层单引号,导致后续内容被shell截断,传给后端的JSON本身就不完整,所以SQL内容被截断。
  • 第二次报错:JSON语法规范中,单引号不属于需要转义的字符,你给单引号加了反斜杠转义后,生成的JSON内容不符合规范,Jackson解析JSON时识别到非法的转义字符,直接抛出解析异常。

解决方案

方案1:调整shell引号规则,避免冲突

把外层包裹JSON的单引号改成双引号,JSON内部原本的双引号用\转义,SQL里的单引号直接保留即可,不需要转义:

curl -s -k --negotiate -u : -H "Content-Type: application/json" -X POST -d "{\"sqlStmt\": \"CALL CORE_LIB.SP_LOAD_STATUS_COMPLETE('2021-02-11',76,' ')\", \"uowTo\": \"20210815\", \"tableName\": \"tableName1\", \"jobEnv\": \"env1\", \"sa\": \"sa1\", \"type\": \"target\"}" http://example.com:443/load

方案2:使用stdin传入JSON,避免转义

通过@-从标准输入读取JSON内容,不需要处理shell引号冲突:

curl -s -k --negotiate -u : -H "Content-Type: application/json" -X POST -d @- http://example.com:443/load <<'EOF'
{"sqlStmt": "CALL CORE_LIB.SP_LOAD_STATUS_COMPLETE('2021-02-11',76,' ')", "uowTo": "20210815", "tableName": "tableName1", "jobEnv": "env1", "sa": "sa1", "type": "target"}
EOF

方案3:将JSON写入文件读取(最稳妥,适合复杂请求)

把请求参数写入req.json文件,内容直接写合法JSON即可:

{
  "sqlStmt": "CALL CORE_LIB.SP_LOAD_STATUS_COMPLETE('2021-02-11',76,' ')",
  "uowTo": "20210815",
  "tableName": "tableName1",
  "jobEnv": "env1",
  "sa": "sa1",
  "type": "target"
}

再用curl直接读取文件:

curl -s -k --negotiate -u : -H "Content-Type: application/json" -X POST -d @req.json http://example.com:443/load

额外提示

当前接口直接接收完整SQL语句执行存在SQL注入风险,建议改造为接收存储过程参数,后端拼接调用逻辑,避免恶意SQL执行。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:51:03