1、项目背景与业务逻辑:调用第三方公司的前端页面处理业务,完了以后第三方公司通过消息推送的方式将处理结果通过接口传到我们的项目,我们的项目通过接口去接收处理结果,并把处理结果保存在本地。
2、第三方公司的消息推送接口用的是“application/octet-stream”格式的请求参数,当时我们项目普遍用的有两种接收方式:
public ResultBean queryWalletBalance(@RequestBody Map<String, String> params){}
public ResultBean queryWalletBalance(@RequestParam Map<String, String> params){}
然后我尝试了这两种都接收不到数据,报:Content type 'application/octet-stream' not supported。
之后换了一种方式成功接收:
public void receiveRegisterStatus(HttpServletRequest request){
//通过HttpServletRequest对象接收请求的参数
log.debug("request==={}",request);
log.error("receiveRegisterStatus-request==={}",request);
BufferedReader reader = null ;
try {
//获取头部数据
reader = request.getReader();
StringBuffer sb = new StringBuffer();
String str ;
//将数据读到StringBuffer里面
while (null != (str = reader.readLine())){
sb.append( str );
}
log.error("receiveRegisterStatus=={}",sb);
JSONObject msgBody = JSON.parseObject(sb.toString()).getJSONObject("msgBody");
ResultBean rb = null;
if(null != msgBody){
//解析保存数据
rb = JSON.parseObject(msgBody.toJSONString(),ResultBean.class);
String registerNo = rb.get("registerNo") != null ? rb.get("registerNo").toString() : "";
String regStatus = rb.get("regStatus") != null ? rb.get("regStatus").toString() : "";
String confirmAmtStatus = rb.get("confirmAmtStatus") != null ? rb.get("confirmAmtStatus").toString() : "";
this.baseBiz.updWalletInfoByRegisterNo(registerNo, regStatus, confirmAmtStatus);
}
} catch (IOException e) {
e.printStackTrace();
log.error("receiveRegisterStatus=e=={}",e);
}finally {
if(null == reader){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}