微信接口HTTP请求的再次分发

2014-10-11 | By Jinyang | Filed in: 技术相关.

不同的业务分布在不同的服务中,但是接入微信公众平台的接口地址只能有一个,所以就需要接入程序接收到请求后,将请求再次转发给需要处理的服务去处理。

1. 获取并保存完整的http请求数据包

直接从 request.getInputStream() 获取数据有一个问题就是因为字节流只允许获取一次,所以第二次想要再获取时会报错,这个是java字节流设计如此,所以就需要用中间变量来进行中转。

try {
InputStream inputStream = request.getInputStream();

ByteArrayOutputStream baos = new ByteArrayOutputStream();  //中间变量
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) > -1 ) {
baos.write(buffer, 0, len);
}
baos.flush();

InputStream stream1 = new ByteArrayInputStream(baos.toByteArray());  //供第一次分析提取数据使用
InputStream stream2 = new ByteArrayInputStream(baos.toByteArray());  //供第二次分析提取数据使用

//System.out.println(inputStream.toString());
SAXReader reader = new SAXReader();
Document document = reader.read(stream1);
Element root = document.getRootElement();
List<Element> elementList = root.elements();
for (Element e : elementList)
//遍历xml将数据写入map
{
map.put(e.getName(), e.getText());
System.out.println(e.getName()+”:”+e.getText());
}

StringBuffer out = new StringBuffer();
byte[] b = new byte[4096];
for (int n; (n = stream2.read(b)) != -1;) {
out.append(new String(b, 0, n));
}
String xmlstr= out.toString(); //输入转为字符串
System.out.println(“xmlstr:”+xmlstr);
map.put(“xmlstr”,xmlstr);
inputStream.close();
inputStream = null;
} catch (Exception e) {
e.printStackTrace();
}

2. 转发请求

 

* try { if (1==1) {
* System.out.println(“Begin Repost to ***  with:”+xmlstr); String rsp =
* “”; // 响应 http://***/service.jsp //String fwurl
* = “http://***”; //测试环境
* String fwurl =
* “http://***/service.jsp?signature=”
* +request
* .getParameter(“signature”)+”&timestamp=”+request.getParameter(
* “timestamp”)+”&nonce=”+request.getParameter(“nonce”); try { rsp =
* JsonHttpUtil.appadd(fwurl, xmlstr); // 发送请求
* System.out.println(“rsp:”+rsp); if(null!=rsp&&rsp.length()>10) {
* wxService.respToWx(response, rsp); } } catch (Exception e) {
* e.printStackTrace(); } System.out.println(“End Repost”); }
*
* } catch (Exception e) { e.printStackTrace(); }

 

 


发表评论

电子邮件地址不会被公开。 必填项已用*标注