返回报文加密:
以WS接口地址:http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl 为例,调用getRegionCountry 操作。
原接口返回报文:
ESB加密后的返回报文:
实现代码如下:
package com.primeton.esb.weather;
import java.io.ByteArrayInputStream;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.primeton.esb.message.ITipMessagePayload;
import com.primeton.esb.message.TipMessageBuilder;
import sun.misc.BASE64Encoder;
public class ws_to_http {
public ITipMessagePayload iPayload(ITipMessagePayload inMessage) throws Exception {
String body = new String((byte[]) inMessage.getMessagePayload(),"utf-8");
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new ByteArrayInputStream(body.getBytes("UTF-8")));
Element root = document.getRootElement();
//逐层获取节点
Element elm = root.element("Body");
elm = elm.element("getRegionCountryResponse");
elm = elm.element("getRegionCountryResult");
//获取节点下所有数据。注意getText()和getStringValue的区别
//getText():获取不到节点中子节点是内容,可将子节点名作为参数获取单一子节点内容
//getStringValue():获取节点下所有子节点的内容,不包含子节点的标签
String billid = elm.getStringValue();
//删除
//获取当前节点下所有子节点的集合
List<Element> list = elm.elements();
System.out.println(list.size());
for(int i =0;i<list.size();i++) {
//删掉 getRegionCountryResult 节点下所有string节点
Element removeElement=elm.element("string");
elm.remove(removeElement);
}
//转码
//将上面获取到的内容转码
BASE64Encoder encoder = new BASE64Encoder();
byte[] textByte = billid.getBytes("UTF-8");
String encodedText = encoder.encode(textByte);
//将转码后的内容重新赋值给指定的节点
elm.setText(encodedText);
System.out.println("encodedText:"+encodedText);
String modifiedBody = document.asXML();
//重组消息体
TipMessageBuilder builder = TipMessageBuilder.withPayload(modifiedBody.getBytes("UTF-8"));
//赋值系统头
builder.copySystemHeaders(inMessage.getSystemHeaders());
//赋值协议头
Map protocolHeads = (Map) inMessage.getProtocolHeaders();
//报文长度改变需要重新赋值
protocolHeads.put("Content-Length", String.valueOf(modifiedBody.getBytes("UTF-8").length));
builder.setProtocolHeaders(protocolHeads);
return builder.build();
}
}