为什么无法从HTTP请求中解析此Json?
为什么无法从HTTP请求中解析此Json?
我的代码基于SpringBoot
,接收post
请求,解析json
数据并使用jdbc执行。
public class ETLController { @Autowired @Qualifier("ETLService") private ETLServiceImpl ETLServiceImpl; @RequestMapping(value = "/sql", method = RequestMethod.POST) @ResponseBody /** * @param sqlString */ public String identify(HttpServletRequest request) { //String sqlString, int maxRowNum, int maxColumnNum, int maxDuration, long startTime, String killQueryJob, int processResult System.out.println("request: "+request) ; String requestJson = request.getParameter("parametersJson"); System.out.println("requestJson: "+requestJson) ; //Json parser JsonObject object = Json.parse(requestJson).asObject(); //connection parameters String connString = object.get("connString").asString(); String connUserName = object.get("connUserName").asString(); String connPassWord = object.get("connPassWord").asString(); //HQL query parameter String sqlString = object.get("sqlString").asString(); int maxRowNum = object.get("maxRowNum").asInt(); int maxColumnNum = object.get("maxColumnNum").asInt(); int maxDuration = object.get("maxDuration").asInt(); String sqlResult = ETLServiceImpl.executeShellScript(connString, connUserName, connPassWord, sqlString, maxRowNum, maxColumnNum, maxDuration); return sqlResult; }
}
curl命令如下:
curl -H "Content-Type: application/json" -X POST --data '{"sqlString":"select room_id from dim.dim_room","connString":"jdbc:hive2://192.168.7.21:10001/","connUserName":"xxxx","connPassWord":"xxxx","maxRowNum":500,"maxColumnNum":10,"maxDuration":6000}' http://192.168.7.24:xxx/etl/sql
然而,当我通过curl发送post请求时,参数无法解析,requestJson
始终为空。
为什么会出现这个问题,如何解决?
为什么无法从HTTP请求解析出这个JSON的问题出现的原因以及解决方法
问题的原因是JSON数据在HTTP请求中无法被解析,可能是因为以下原因:
1. 在传递的JSON中,没有创建与JSON键相匹配的POJO类的成员变量。为了解决这个问题,可以创建一个POJO类,其中包含与传递的JSON中的键相匹配的成员变量。
解决方法如下:
public class ConnectionString{ private String sqlString; private String connString; private String connUserName; private String connPassWord; private Long maxRowNum ; private Long maxColumnNum; private Long maxDuration; //所有的getter和setter方法 }
2. 在方法`identify()`中进行简单的更改,直接将JSON作为Java对象接收。修改方法参数如下:
public String identify(HttpServletRequest request, ConnectionString connectionString){ //在这里接收通过curl传递的数据 System.out.println(connectionString.getSqlString()); //这将打印你作为请求主体传递的值 }
3. 需要编辑传递的curl请求中的JSON数据,移除`parametersJson`键。修改后的JSON数据如下:
'{"sqlString":"select room_id from dim.dim_room","connString":"jdbc:hive2://192.168.7.21:10001/","connUserName":"xxxx","connPassWord":"xxxx","maxRowNum":500,"maxColumnNum":10,"maxDuration":6000}'
而不是
'parametersJson='{"sqlString":"select room_id from dim.dim_room","connString":"jdbc:hive2://192.168.7.21:10001/","connUserName":"xxxx","connPassWord":"xxxx","maxRowNum":500,"maxColumnNum":10,"maxDuration":6000}''
需要注意的是,Spring会自动将请求体数据转换为Java对象。Spring内部使用`jackson-databind`库的类来执行此操作。
为什么无法从HTTP请求中解析出这个JSON?
问题的原因是请求中的JSON格式错误,无法被解析。解决方法是按照正确的JSON格式进行请求。
下面是一个可以尝试的解决方法:
可以使用curl命令发送HTTP请求,并在请求中包含正确格式的JSON数据。具体命令如下:
curl -H "Content-Type: application/json" -X POST -d '{"sqlString":"select room_id from dim.dim_room","connString":"jdbc:hive2://192.168.7.21:10001/","connUserName":"magic","connPassWord":"w8spDGCJVMG3J2MWio5X","maxRowNum":500,"maxColumnNum":10,"maxDuration":6000}' http://192.168.7.24:xxx/etl/sql
在上述命令中,我们使用了curl工具发送了一个POST请求,并指定了请求头的Content-Type为application/json,表示请求体中的数据是JSON格式的。请求体中的JSON数据包含了以下字段:sqlString、connString、connUserName、connPassWord、maxRowNum、maxColumnNum和maxDuration。这些字段的具体值可以根据实际情况进行修改。
通过执行上述curl命令,我们可以发送包含正确格式的JSON数据的HTTP请求,从而解决无法解析JSON的问题。