记一个java和php都能调用的http接口
2019独角兽企业重金招聘Python工程师标准>>>
先贴一下httClient端的代码,
/*** HTTP的RequestBody方式请求*/public static String sendRequest(String url, String params, String encoding, int timeout) throws IOException {// 设置PostMethodPostMethod 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<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取参代码:
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来输出。
PrintWriter pw=null;try {pw=response.getWriter();pw.println(result);pw.flush();} catch (IOException e) {logger.error("插入记录过程中回写失败!");}finally{pw.close();}
转载于:https://my.oschina.net/ytliyang/blog/708340
记一个java和php都能调用的http接口相关推荐
- Java spring boot 阿里云调用人脸识别接口,本地sdk上传到阿里云调用api
Java spring boot 阿里云调用人脸识别接口 没有写测试类,工具类如下,有access_key_id和access_key_secret传参调用就可使用 代码如下: pom.xml依赖 & ...
- 每一个JAVA程序员都应该怀揣一个架构师的梦,这样你的职业发展前景一片大好...
随着互联网发展经历了PC互联网时代.移动互联网时代以及IOT物联网智能时代,在万物皆互联的人工智能时代,数据信息爆发式增长,并发量也变得越来越有挑战性,并对系统的可用性.扩展性.易用性等提出更高的要求 ...
- 三菱数控系统M70 M80,纯协议TCP方式采集实战,windows,linux,C#,java,C,C++都能调用
1.用三菱SDK的方式采集,需要安装驱动包,这个驱动包是windows 操作系统下,做网关的不能用这种方式采,可以用纯tcp协议 2.有了这个协议,不管你用C# ,JAVA,C或者其它语言来实现TCP ...
- [ASP,VB] - 利用ASP调用API COM接口实现开关机
来源:http://www.111cn.net/asp/3/35f5b04c0c9f40c9f03a1b56d641ac3f.htm 服务器脚本要控制些开关机命令模式的知都要调用win api接口来实 ...
- java中计算一个文件的总字节数_【JVM故事】一个Java字节码文件的诞生记
作者:李新杰·转自微:信公众号"编程新说" 万字长文,完全虚构.(12000字) (一) 组里来了个实习生,李大胖面完之后,觉得水平一般,但还是留了下来,为什么呢?各自猜去吧. 李 ...
- 制作一个Java即时翻译器——网页抓取调用百度翻译API
第一次在CSDN写博客,想着记录一下自己一些作业过程中的问题和心得,没想到要用Markdown语言写,说实话我还真没用过呢,还要边学边写.话不多说,进入正题. 1.引言 平时在上网浏览网站或者阅读一些 ...
- Java web 开发填坑记 2 -如何正确的创建一个Java Web 项目
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/72566261 本文出自[赵彦军的博客] Java web 开发填坑记 1-如何正确 ...
- 判断一个java对象中的属性是否都未赋值_100道Java基础面试题(一)
100道Java基础面试题(一)未来大家将步入职场,面试的时候面试官还会问大家一些Java相关的问题.小编整理出100道非常实用的面试题目,可以帮助双体的小伙伴应对面试,我们一起来看看都有哪些吧! 1 ...
- java如何在一个Action中调用另外一个Action
java如何在一个Action中调用另外一个Action /*** 通过远程调用其他系统里的URL获取数据的方法** @param path 需要调用远程的URL地址* @return 返回的是调用U ...
最新文章
- 内存分页不就够了?为什么还要分段?
- 京东11.11大促背后,那些系统架构经历了些什么
- 解决TCP网络传输“粘包”问题
- 学python能赚什么外卖-用python模拟美团外卖骑手推送请求
- Web 趋势榜:上周最有意思、最热门的 10 大 Web 项目 - 210625
- kafka 运行一段时间报错Too many open files
- 数据库杂谈(六)——数据库管理系统
- mysql架构深入_mysql性能优化2:深入认识mysql体系架构
- nginx 修改 max open files limits
- 在windows文件系统中加右键执行程序
- ajax 页面部分先显示图片后出数据
- 安卓第三天笔记--通知-进度条-时期
- jqgrid本地数据例子_FMS财务系统:日常数据核对与处理
- 中文汉化AE扩展脚本 AtomX 3.0.0 不断更新预设包文件
- 图的遍历:BFS算法学习
- 表白生成器PHP源码,带自动生成的php表白程序 v1.0
- PyTorch深度学习(B站刘二大爷)第九讲 多分类问题
- Java 输入判断5,7倍数
- NET 2.0(C#)调用ffmpeg处理视频的方法
- 智能手机查看上网IP地址的多种方法