您的位置:首页 > 理论基础 > 计算机网络

记一个java和php都能调用的http接口

2016-07-08 00:00 483 查看
摘要: 之前有一个http的接口,一直在对接的都是java的客户,忽然来了个拍黄片的来对接,发现还是有一些差别的,然后顺便把httpClient这种接口方式记录下

先贴一下httClient端的代码,

[code=plain]	/**
* 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是个加密处理,不要在乎这些细节。

然后让我们写一下接收:

[code=plain]	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的封装


于是对应的取参代码:

[code=plain] 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<String, Object> map = new HashMap<String, Object>();
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取参代码:

[code=plain] public String testRequest(Map requestMap) {

String[] requestParams = (String[]) requestMap.get("params");

String parameters = "";

String[] timestamp = (String[]) requestMap.get("timestamp");
Map<String, Object> map = new HashMap<String, Object>();
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来输出。

[code=plain]PrintWriter pw=null;
try {
pw=response.getWriter();
pw.println(result);
pw.flush();
} catch (IOException e) {
logger.error("插入记录过程中回写失败!");
}finally{
pw.close();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息