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接口相关推荐

  1. Java spring boot 阿里云调用人脸识别接口,本地sdk上传到阿里云调用api

    Java spring boot 阿里云调用人脸识别接口 没有写测试类,工具类如下,有access_key_id和access_key_secret传参调用就可使用 代码如下: pom.xml依赖 & ...

  2. 每一个JAVA程序员都应该怀揣一个架构师的梦,这样你的职业发展前景一片大好...

    随着互联网发展经历了PC互联网时代.移动互联网时代以及IOT物联网智能时代,在万物皆互联的人工智能时代,数据信息爆发式增长,并发量也变得越来越有挑战性,并对系统的可用性.扩展性.易用性等提出更高的要求 ...

  3. 三菱数控系统M70 M80,纯协议TCP方式采集实战,windows,linux,C#,java,C,C++都能调用

    1.用三菱SDK的方式采集,需要安装驱动包,这个驱动包是windows 操作系统下,做网关的不能用这种方式采,可以用纯tcp协议 2.有了这个协议,不管你用C# ,JAVA,C或者其它语言来实现TCP ...

  4. [ASP,VB] - 利用ASP调用API COM接口实现开关机

    来源:http://www.111cn.net/asp/3/35f5b04c0c9f40c9f03a1b56d641ac3f.htm 服务器脚本要控制些开关机命令模式的知都要调用win api接口来实 ...

  5. java中计算一个文件的总字节数_【JVM故事】一个Java字节码文件的诞生记

    作者:李新杰·转自微:信公众号"编程新说" 万字长文,完全虚构.(12000字) (一) 组里来了个实习生,李大胖面完之后,觉得水平一般,但还是留了下来,为什么呢?各自猜去吧. 李 ...

  6. 制作一个Java即时翻译器——网页抓取调用百度翻译API

    第一次在CSDN写博客,想着记录一下自己一些作业过程中的问题和心得,没想到要用Markdown语言写,说实话我还真没用过呢,还要边学边写.话不多说,进入正题. 1.引言 平时在上网浏览网站或者阅读一些 ...

  7. Java web 开发填坑记 2 -如何正确的创建一个Java Web 项目

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/72566261 本文出自[赵彦军的博客] Java web 开发填坑记 1-如何正确 ...

  8. 判断一个java对象中的属性是否都未赋值_100道Java基础面试题(一)

    100道Java基础面试题(一)未来大家将步入职场,面试的时候面试官还会问大家一些Java相关的问题.小编整理出100道非常实用的面试题目,可以帮助双体的小伙伴应对面试,我们一起来看看都有哪些吧! 1 ...

  9. java如何在一个Action中调用另外一个Action

    java如何在一个Action中调用另外一个Action /*** 通过远程调用其他系统里的URL获取数据的方法** @param path 需要调用远程的URL地址* @return 返回的是调用U ...

最新文章

  1. 内存分页不就够了?为什么还要分段?
  2. 京东11.11大促背后,那些系统架构经历了些什么
  3. 解决TCP网络传输“粘包”问题
  4. 学python能赚什么外卖-用python模拟美团外卖骑手推送请求
  5. Web 趋势榜:上周最有意思、最热门的 10 大 Web 项目 - 210625
  6. kafka 运行一段时间报错Too many open files
  7. 数据库杂谈(六)——数据库管理系统
  8. mysql架构深入_mysql性能优化2:深入认识mysql体系架构
  9. nginx 修改 max open files limits
  10. 在windows文件系统中加右键执行程序
  11. ajax 页面部分先显示图片后出数据
  12. 安卓第三天笔记--通知-进度条-时期
  13. jqgrid本地数据例子_FMS财务系统:日常数据核对与处理
  14. 中文汉化AE扩展脚本 AtomX 3.0.0 不断更新预设包文件
  15. 图的遍历:BFS算法学习
  16. 表白生成器PHP源码,带自动生成的php表白程序 v1.0
  17. PyTorch深度学习(B站刘二大爷)第九讲 多分类问题
  18. Java 输入判断5,7倍数
  19. NET 2.0(C#)调用ffmpeg处理视频的方法
  20. 智能手机查看上网IP地址的多种方法

热门文章

  1. 生成一定数量的不重复随机数
  2. C++----为什么不让用using namespace std
  3. CSS样式(一)- 基本语法
  4. 李航《统计学习方法》SMO算法推导中的思考
  5. 深度学习——卷积块回顾
  6. php 7 xhprof,php7中使用xhprof解析
  7. java对rgb取反_颜色取反 rgb COLORREF | 学步园
  8. it有啥好咨询的_蓝盟浅析,IT外包的四种常用方式
  9. jmeter安装 java,Windows下安装jmeter图文教程
  10. jdbc教程_JDBC教程