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

原创
2016/07/08 14:12
阅读数 4.8K

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

 

 

展开阅读全文
加载中

作者的其它热门文章

打赏
1
1 收藏
分享
打赏
0 评论
1 收藏
1
分享
返回顶部
顶部