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

先贴一下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的封装

c092f9228ea4cf7abd55fbfd137ab745.png

于是对应的取参代码:

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的封装

38d62417aeafcf2e874d78c4c56a7cf6.png

其中取自map是这样的:

76cc22e949385f5039d66a53dc785195.png

据我估计DefaultMultipartHttpServletRequest应该是HttpServletRequest的子类,顾可以通过传过来的request来判断对方是java还是php,至于PHP是这么写的,我就不是很懂了,但是有对方的一个截图:

a526cca124329de4a9204597dc744432.png

对应的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();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值