文档章节

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

Pig-man
 Pig-man
发布于 2016/07/08 14:12
字数 938
阅读 1995
收藏 1

先贴一下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<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();
		}

 

 

© 著作权归作者所有

Pig-man
粉丝 21
博文 62
码字总数 47800
作品 0
青浦
程序员
私信 提问
C/C++调用PHP

由于缺少C/C++程序员,所以想用C/C++做控制器调用PHP(PHP的人不缺),主要由PHP来写逻辑,由C来调用,但不能用HTTP的方式去调用PHP,最好可以像“$system=new Java("java.lang.System");prin...

陆钧
2010/10/27
7.7K
12
PHP-Java-Bridge的使用(平安银行支付功能专版)

去年做平安银行的时候,用到了PHP-Java-Bridge,后来写了一篇博客记录使用PHP-Java-Bridge的一些心得(连接:http://my.oschina.net/kenblog/blog/316234)。 后来有很多陆陆续续的朋友在做平...

卖小女孩的小火柴
2015/04/13
0
1
操作系统,windows编程,网络,socket

首发:个人博客,更新&纠错&回复 之前关于c/s的一篇博文只记了思路没记代码,而且表达不清晰,事后看不知所云,这个习惯要改。 这十几天学了点关于操作系统、windows编程和网络,主要看的书有...

祁达方
2015/11/11
0
0
ice(Internet Communications Engine) window 安装与配置

什么是ice ice是一个面向对像的中间件平台,因此,这意味着ice提供了一个工具,一些api和一些类库用来构造面向对像蝗基于client-server 的应用程序,因此,ICE适用于在异构环境中使用,他的c...

李长春
2011/12/01
0
0
JNI 的多线程

之前的博文中讲述了JNI的基础知识: Java 类型和C/C++类型的转换 cygwin + gcc+makeFile入门(三): JNI的编译 这两篇文章讲述了JNI最普遍的两个问题, 环境的建立以及参数的传递. JNI作为连接J...

晨曦之光
2012/03/09
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

spring 本类中方法调用另外一个方法事务不生效

1、在spring配置文件中添加 <aop:aspectj-autoproxy expose-proxy="true"/> 声明自动代理 2、AopContext.currentProxy()来获取代理类 3、使用代理类proxy进行代理调用内部声明了事务的方法 ......

重城重楼
10分钟前
0
0
项目 banner 乱弹

------------------------------------------ 村上春树 ------------------------------------- 如果我爱你,而你也正巧爱我,你头发乱了的时候,我会笑笑地替你拨一拨,然后手还留恋地在你...

宿小帅
22分钟前
0
0
PHP获取未来七天的日期和星期

php获取未来七天的日期和星期代码 第一步:获取需要天数的日期,然后调用函数 //获取未来七天的日期 for($i=1;$i<8;$i++){ $dateArray[$i]=date('Y-m-d',strtotime(d...

一只懒猫-
33分钟前
0
0
总结:IO模型

分类 多路复用 参考文章: https://www.jianshu.com/p/6a6845464770 https://www.cnblogs.com/zingp/p/6863170.html https://blog.csdn.net/sehanlingfeng/article/details/78920423......

浮躁的码农
36分钟前
0
0
fabric-sdk-java 1.4安装说明

Hyperledger Fabric Java SDK是开发基于Hyperledger Fabric区块链的Java应用之必备开发包。本文将介绍如何在Maven、Gradle和Eclipse中安装使用最新1.4版本的Hyperledger Fabric Java SDK。 ...

汇智网教程
38分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部