先贴一下httClient端的代码,
/**
* HTTP的RequestBody方式请求
*/
public static String sendRequest(String url, String params, String encoding, int timeout) throws IOException {
// 设置PostMethod
PostMethod postMethod = new PostMethod(url);
postMethod.getParams().setContentCharset(encoding);
postMethod.getParams().setHttpElementCharset(encoding);
//设置 LB签名
String digest = SecurityUtil.getDigest(params);
// 设置参数
postMethod.setParameter("params", params);
postMethod.setParameter("digest", digest);
// http client 参数设置 连接超时 读取数据超时
HttpClient httpClient = new HttpClient();
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(timeout);
httpClient.getHttpConnectionManager().getParams().setSoTimeout(timeout);
try {
httpClient.executeMethod(postMethod);
if (postMethod.getStatusCode() == HttpStatus.SC_OK) {
return postMethod.getResponseBodyAsString();
}
return ParameterUtil.SERVER_ERROR;
} finally {
postMethod.releaseConnection();
}
}
上面的四个参数分别是对方接口的URL,传递的参数,传递的字符编码格式,接口响应时间。
其中的digest是个加密处理,不要在乎这些细节。
然后让我们写一下接收:
public void newOrder(HttpServletRequest request,HttpServletResponse response){
response.setContentType("application/json;charset=UTF-8");
logger.error(">>>=====客户调用订单下发接口开始");
String result=null;
String orderNo="";//用于推送异常时日志记录
// 获取入参
BufferedReader reader = null;
String parameters;
if (request instanceof DefaultMultipartHttpServletRequest) {
//对接入的php类http请求进行验证
DefaultMultipartHttpServletRequest defaultMultipartHttpServletRequest = (DefaultMultipartHttpServletRequest) request;
Map requestMap = defaultMultipartHttpServletRequest.getParameterMap();
parameters = testRequest(requestMap);
} else {
//对接入的java类http请求进行验证
try {
reader = request.getReader();
} catch (IOException e) {
e.printStackTrace();
}
parameters = testRequest(reader);
}
return parameters;
这里要注意的是,java和php对传过来的request封装是不一样的,我上截图
java对request的封装
于是对应的取参代码:
public String testRequest(BufferedReader reader) {
String str = "";
String parameters = "";
try {
while ((str = reader.readLine()) != null) {
parameters += str;
}
} catch (IOException e) {
e.printStackTrace();
}
RequestParameterEntity req = JSONObject.parseObject(parameters,
RequestParameterEntity.class);
// 时间戳
String timestamp = req.getTimestamp();
// 获取客户资料
Map map = new HashMap();
map.put("code", req.getCode());
CustomerEntity queryCustomer = customerService.queryCustomer(map);
String secretKey = null;
if (queryCustomer != null) {
secretKey = queryCustomer.getSecretKey();
// 验证用户是否禁用状态
if (Integer.valueOf(queryCustomer.getStatus()) > 0) {
parameters = ParameterUtil.STATUS_ILLEGAL;
return parameters;
}
// ip验证
// String serverIp = queryCustomer.getServerIp();
// String loginIp = request.getRemoteAddr();
// 如果有设置客户IP则验证,否则不验证!
// if (serverIp != null && !"".equals(serverIp)) {
// String[] ip = serverIp.split(",");
// boolean allowed = false;
// for (String strIp : ip) {
// if (strIp == loginIp || strIp.equals(loginIp)) {
// allowed = true;
// }
// }
// if (!allowed) {
// parameters = ParameterUtil.LOGIN_IP_FAILURE;
// return parameters;
// }
// }
} else {
// 用户不存在
parameters = ParameterUtil.CODE_ILLEGAL;
return parameters;
}
// 验证签名
Boolean rights = ParameterUtil.checkRights(req, secretKey);
if (!rights) {
parameters = ParameterUtil.DIGEST_FAILURE;
return parameters;
}
// 验证时间戳
// 时间戳验证使用,判断请求是否在有效的时间戳范围内,时间戳范围根据情况自行定义
long sendTime = Long.parseLong(timestamp);
long now = System.currentTimeMillis();
long effectiveTimestamp = 1800000;
if (Math.abs(now - sendTime) > effectiveTimestamp) {// 时间戳验证
parameters = ParameterUtil.TIMESTAMP_FAILURE;
}
return parameters;
}
php对request的封装
其中取自map是这样的:
据我估计DefaultMultipartHttpServletRequest应该是HttpServletRequest的子类,顾可以通过传过来的request来判断对方是java还是php,至于PHP是这么写的,我就不是很懂了,但是有对方的一个截图:
对应的php取参代码:
public String testRequest(Map requestMap) {
String[] requestParams = (String[]) requestMap.get("params");
String parameters = "";
String[] timestamp = (String[]) requestMap.get("timestamp");
Map map = new HashMap();
String[] code = (String[]) requestMap.get("code");
map.put("code", code[0]);
CustomerEntity queryCustomer = customerService.queryCustomer(map);
String secretKey = null;
if (queryCustomer != null) {
secretKey = queryCustomer.getSecretKey();
// 验证用户是否禁用状态
if (Integer.valueOf(queryCustomer.getStatus()) > 0) {
parameters = ParameterUtil.STATUS_ILLEGAL;
return parameters;
}
} else {
// 用户不存在
parameters = ParameterUtil.CODE_ILLEGAL;
return parameters;
}
// 验证签名
String[] digest = (String[])requestMap.get("digest");
String[] params = (String[]) requestMap.get("params");
String digest2 = SecurityUtil.getDigest(params[0], code[0], secretKey);
boolean flag = digest[0].equals(digest2);
if (!flag) {
parameters = ParameterUtil.DIGEST_FAILURE;
return parameters;
}
// 验证时间戳
// 时间戳验证使用,判断请求是否在有效的时间戳范围内,时间戳范围根据情况自行定义
long sendTime = Long.parseLong(timestamp[0]);
long now = System.currentTimeMillis();
long effectiveTimestamp = 1800000;
if (Math.abs(now - sendTime) > effectiveTimestamp) {// 时间戳验证
parameters = ParameterUtil.TIMESTAMP_FAILURE;
return parameters;
}
JSONObject jsonObject = new JSONObject() ;
jsonObject.put("code",code[0]);
jsonObject.put("digest",digest[0]);
jsonObject.put("timestamp",timestamp[0]);
jsonObject.put("params",params[0]);
parameters += jsonObject.toString().trim();
return parameters;
}
还差最后一点回执问题,将要返回的东西放入result里,通过PrintWriter来输出。
PrintWriter pw=null;
try {
pw=response.getWriter();
pw.println(result);
pw.flush();
} catch (IOException e) {
logger.error("插入记录过程中回写失败!");
}finally{
pw.close();
}