关于Jfinal接收post请求body里面的json数据问题

做一个手机端的服务器,大量用到post请求的传送json数据,看手册时发现,Jfinal接收连接在url后面的参数和表单域的参数很简单,但是如何接收post请求体(Content Body)里面的json数据?只能自己获取底层servlet读取吗?

评论区

JFinal

2016-06-29 18:20

使用jfinal 提供的 HttpKit.readData(getRequest()) 即可获取到

happyboy

2016-07-04 18:31

如果是手机端服务器的话,是不适合通过传参来传递的,而是应该通过发送数据流来实现,相应的服务器通过读取request中的数据流来接收。通过参数传递的话,你的思路就错了。

jianggr

2017-11-22 23:26

private boolean isReadData = false;
private String readData = "";
@Override
public String getPara() {
if ("application/json".equals(getRequest().getContentType())
|| "text/json".equals(getRequest().getContentType())) {
if(!isReadData){
readData = HttpKit.readData(getRequest());
isReadData = true;
}
return readData;
}
return super.getPara();
}

@Override
public String getPara(String name) {
if ("application/json".equals(getRequest().getContentType())
|| "text/json".equals(getRequest().getContentType())) {
return JSONObject.parseObject(getPara()).getString(name);
}
return super.getPara(name);
}

rirai

2018-03-22 20:18

@jianggr 是不是自己定义一个类并继承于Controller?

rirai

2018-03-22 20:29

@jianggr 这样做对于复杂的json不太适合,而且每次getPara(*)都要进行判断,感觉效率有点低吧。

jianggr

2018-04-05 18:57

@rirai 这个就是继成的类处理的 我也不太知道更合适的方式 还请大牛赐教

rirai

2018-04-08 08:54

@jianggr 不好意思,我是小白而已。我最后的解决方案和你也差不多,就是继承这个类,然后再写一个Intercept拦截,用@Before放在controller的前面,确保在getPara之前,先把数据读取到自己的map里面。仅此而已。

892653986

2018-06-23 16:37

@JFinal 赞, 牛逼

排骨逗逗

2018-10-22 19:33

@JFinal 会出现ios系统的手机发送post请求,后台接收不到吗

JFinal

2018-10-22 19:45

@排骨逗逗 不会出现,除非你 ios 同时上传了文件,但这种情况被证实为 ios 这端发送的格式不对

因为 jfinal 在服务端是遵守的 http 协议,所以只要你客户端也遵守就不会有问题

排骨逗逗

2018-10-22 19:55

@JFinal 我这边出现了一个奇怪的问题,我用ios系统的浏览器发了一个post请求,走不到后台断点,换了电脑浏览器发送却可以,请问以前有过这种情况吗

JFinal

2018-10-22 20:41

@排骨逗逗 jfinal 处在后端,只能管到后端,这种情况肯定是客户端的问题

白云君

2018-11-04 18:49

赞 我也遇到了这个问题 body里面是不是就不用管带参什么的了吧,像getpara一样还要加参数名?

tcm199695

2019-04-24 11:04

@JFinal 用HttpKit.readData(getRequest())会把这次请求的流给关闭了,所以会影响到后面jfinal打印参数的方法报错java.lang.IllegalStateException: getInputStream() can't be called after getReader()

JFinal

2019-04-24 11:35

@tcm199695 使用 getRawData() 即可

或者使新版本的 jfinal,其中的 HttpKit 去掉了关闭动作