先说一下问题,前几天由于工作需要,我这边需要提供几个接口用来接收厂家的数据推送。这没什么难的,写接口无非就是写几个controller来接收参数就可以了。我们先来看看接口文档,他们提供的参数格式如下,数据以作处理只保留格式。
{
"time": 1515294211,
"type": "1",
"code": "111111",
"dt": "1",
"data": {
"p": 4000,
"l": 2000,
"b": 3690,
"s": 89
}
}
是不是跟平时接收参数的方式不太一下,附篇博客关于controller接收参数的几种方式, 链接: SpringBoot Controller接收参数的几种常用方式 我们发现@requestBody接收的参数类型格式和这个相似,我们写个demo测试一下
1.利用@RequestBody接收请求体中的参数
@PostMapping("/guc301")
public String receives(@RequestBody Map<String,Object> map){
log.info(map.get("time")+"---------");
return map.get("data").toString();
}
运行接口如下,没问题。 接下来我们重点说一下第二种方式。
2.利用io流接收请求体中的参数
我们先来看看代码
@RestController
@Slf4j
@RequestMapping("/log")
public class Gcu300 {
@PostMapping("/gcu300")
public String receive(HttpServletRequest request){
ResultMessage resultMessage = null;
String result = null;
try {
@Cleanup ServletInputStream inputStream = null;
@Cleanup ByteArrayOutputStream outputStream = null;
byte[] rs = new byte[1024];
inputStream = request.getInputStream();
outputStream = new ByteArrayOutputStream();
int len = 0;
byte[] req = null;
while ((len = inputStream.read(rs)) != -1) {
outputStream.write(rs, 0, len);
req = outputStream.toByteArray();
}
result = new String(req, "UTF-8");
log.info("result={}", result);
resultMessage = new ResultMessage();
}catch (Exception e){
log.info("数据接收异常"+e,e.toString());
resultMessage = new ResultMessage(false,"10001");
}
return JSON.toJSONString(resultMessage);
}
}
如上便可以接收到数据了。还有记得关数据流,由于我在这儿用到了lombok,当流不用的时候会自动关了。