记一个java和php都能调用的http接口
2016-07-08 00:00
483 查看
摘要: 之前有一个http的接口,一直在对接的都是java的客户,忽然来了个拍黄片的来对接,发现还是有一些差别的,然后顺便把httpClient这种接口方式记录下
先贴一下httClient端的代码,
上面的四个参数分别是对方接口的URL,传递的参数,传递的字符编码格式,接口响应时间。
其中的digest是个加密处理,不要在乎这些细节。
然后让我们写一下接收:
这里要注意的是,java和php对传过来的request封装是不一样的,我上截图
java对request的封装
于是对应的取参代码:
php对request的封装
其中取自map是这样的:
据我估计DefaultMultipartHttpServletRequest应该是HttpServletRequest的子类,顾可以通过传过来的request来判断对方是java还是php,至于PHP是这么写的,我就不是很懂了,但是有对方的一个截图:
对应的php取参代码:
还差最后一点回执问题,将要返回的东西放入result里,通过PrintWriter来输出。
先贴一下httClient端的代码,
[code=plain] /** * 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是个加密处理,不要在乎这些细节。
然后让我们写一下接收:
[code=plain] 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的封装
于是对应的取参代码:
[code=plain] 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取参代码:
[code=plain] 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来输出。
[code=plain]PrintWriter pw=null; try { pw=response.getWriter(); pw.println(result); pw.flush(); } catch (IOException e) { logger.error("插入记录过程中回写失败!"); }finally{ pw.close(); }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树