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
相关产品推荐
相关产品推荐

