依然还是那个调用运营商接口的问题,当时给了我两种接口,一个是全国所有的,一个是江西电信的,就是那个用了wsdl形式的接口。用了两天的时间解决了它,后来全国通用的接口就好多了,但是接口源源不断的来。而且每种接口的参数不同,如果因为一种接口不同就去改数据库的话,那样成本太大。所以我选用了配置文件的形式。最终达到的效果就是,再来一个接口,配置文件中添加一个节点,添加一个实现类……
写一个xml的配置文件很容易,但是在原有的配置文件有两种,一种是*.properties,一种是*.xml。所以首先还是弄清楚这两者的区别。
*.properties和*.xml的区别
properties配置文件,风格是一个属性对应于一个值(key=value)这样的键值匹对模式。properties适合小型配置的操作。xml是标准的数据传输和存储格式,不仅方便查看,而且便于操作,适合于大型配置的操作,用xml更为灵活一些
如果是网络需要将配置文件网络传输,或者转化为对象等等复杂的操作,或者格式规则比较严格,则使用xml,写个dtd这样就不会出错。如果只是简单的项目中的配置properties就可以满足了
相对于我的需求,显然是xml形式的比较合适,so果断选择xml配置文件,其实当时是直接选的,在这里小矫情一下。
读取配置文件xml
选好了xml之后,怎样读取是实现它的下一步。
我的xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<business_search>
<!--search配置-->
<interface_group id="quanguointerface">
<!--全国通用 移动、联通、电信-->
<quanguoyd>
<parser>com.demo.controller.business.interfacedistribute.WholeCountryReader</parser>
<url>url</url>
<apitype>方法名</apitype>
<apiid>保密</apiid>
<apisecret>保密</apisecret>
<productno>保密</productno>
<othername>YD</othername>
</quanguoyd>
<!--江西电信-->
<jiangxi id="jiangxi14">
<parser>com.demo.controller.business.interfacedistribute.JiangXiDianXinReader</parser>
<url>地址</url>
<methodname>recharge</methodname>
<account>保密</account>
<pwd>保密</pwd>
</jiangxi>
<!--还有很多接口-->
</interface_group>
</business_search>
配置文件的读取类:
/**
* 通过运营商接口名称查询配置文件的接口配置信息
* author:xiaoguai
* 2015年12月3日15:06:08
* @param businessinterfacename 运营商接口名称
*/
public String simpleDocumentXmlRead(String businessinterfacename,String phoneNumber,String flowValue,String businessCode){
_BusinessParser parser=null;
String result="";
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
try{
DocumentBuilder db=dbf.newDocumentBuilder();
//读取到运营商接口配置文件xml
org.w3c.dom.Document doc=db.parse("././././././src/main/resources/businessinterface-config.xml");
//根据接口名称获取到接口配置
NodeList businessList=doc.getElementsByTagName(businessinterfacename);
if (businessList.getLength()>0){
Node business=businessList.item(0);
org.w3c.dom.Element itemlink=(org.w3c.dom.Element)business.getChildNodes().item(1);
String parserName=itemlink.getNodeName();
String parserValue=itemlink.getFirstChild().getNodeValue();
System.out.println(parserName+":"+parserValue);
//通过parserValue去实例化一个类
Class parserClass=Class.forName(parserValue);
parser =(_BusinessParser) parserClass.newInstance();
result= parser.parse(businessinterfacename,phoneNumber,flowValue);
System.out.println("--------"+"now time is : "+new Date());
}
}catch (Exception e){
e.printStackTrace();
}
return result;
}
所有接口的父类
public interface _BusinessParser {
public String keyword=null;
public String parse(String businessinterfacename,String phoneNumber,String flowValue) throws ParserConfigurationException, IOException, SAXException;
}
然后,各个接口对应的实现类分别实现接口的parse方法即可。
这样,以后再来一个接口,我只需在配置文件中添加一个节点,然后去写一个实现类就好。其实这样做的目的还有一个,就是每次调完接口还要进行一些插入、更新的操作,这样看似实现了抽象的思想,但是其实每种接口最后可能返回的json参数是不同的,类型也不同。对于回调还是个问题,所以,觉得自己只是实现了一半的抽象。