java 使用axis调用第三方发布的需要证书验证的webservice接口:
一、首先我们先保证在浏览器下可以正常访问此webs
A:利用第三方提供的*.p12文件,把此证书导入到浏览器中,导入方法不在说,网上很多。导入以后,浏览器应该就可以直接访问此webs。
二、接下来在客户端开发的时候,程序里面怎么调用:
A:根据对方提供的*.cer文件(如果没提供,我们在导入p12文件以后,再次打开对方的webs地址的时候会提示我们导入证书嘛,吧这个证书导出就是这里要用的cer文件;PS:我是这样理解的:p12文件就像一个key值,(根据p12然后让你安装证书类似于验证cookie和session)浏览器导入p12以后再去访问webs,服务器端验证正确给你安装证书),利用命令生成keystore :
keytool -v -import keystore -src keystore assetclient.p12 -src storetype PKCS12 -dest keystore c:
\\test2.keystore -deststoretype JKS(可在网上查找keytool工具生成证书的方法)
和truststore;其中p12文件生成keystore,cer文件生成truststore;代码里面调用的时候就好像模仿浏览器一样,只不过他不是验证p12然后返回cer,而是两个都需要验证;
调用过程代码如下:
private static String create_user_url="https://asset1.10jqka.com.cn/service/webservice/FundManagerService?wsdl"; //开户
private static String namespace="http://webservice.invest.com/"; //命名空间
public static void main(String[] args) {
try {
System.setProperty("javax.net.ssl.keyStore","D:/public/test2.keystore"); //p12文件生成(需要导入到浏览器的)
System.setProperty("javax.net.ssl.trustStore","D:/public/test.keystore"); //server.cer生成
System.setProperty("javax.net.ssl.keyStorePassword", "123456");
System.setProperty("javax.net.ssl.trustStorePassword", "123456");
Service service =new Service();
Call call =(Call) service.createCall();
call.setTargetEndpointAddress(new URL(create_user_url));
call.setOperationName(new QName(namespace, "addUnit"));
call.addParameter("institution_id", XMLType.XSD_STRING,ParameterMode.IN);
call.addParameter("fund_id", XMLType.XSD_STRING,ParameterMode.IN);
call.addParameter("unit_name",XMLType.XSD_STRING,ParameterMode.IN);
call.addParameter("pwd",XMLType.XSD_STRING,ParameterMode.IN);
call.addParameter("operator_name",XMLType.XSD_STRING,ParameterMode.IN);
call.addParameter("operator_pwd",XMLType.XSD_STRING,ParameterMode.IN);
call.addParameter("brokerage_rate",XMLType.XSD_STRING,ParameterMode.IN);
call.addParameter("guaranteed_balance",XMLType.XSD_STRING,ParameterMode.IN);
call.addParameter("credit_balance",XMLType.XSD_STRING,ParameterMode.IN);
call.setReturnClass(Element.class);
Object[] param={"1","1","fusp",TongHuaShunUtils.encryption("fsp88927"),"admin",TongHuaShunUtils.encryption("adminadmin"),"55.5","500","100"};
Object result =call.invoke(param);
Element ele = (Element) result;
Document document = ele.getOwnerDocument();
DOMImplementationLS domImplLS = (DOMImplementationLS) document.getImplementation();
LSSerializer serializer = domImplLS.createLSSerializer();
String str = serializer.writeToString(ele);
System.out.println(str);
} catch (Exception e) {
e.printStackTrace();
}
}
和truststore;其中p12文件生成keystore,cer文件生成truststore;代码里面调用的时候就好像模仿浏览器一样,只不过他不是验证p12然后返回cer,而是两个都需要验证;
调用过程代码如下:
private static String create_user_url="https://asset1.10jqka.com.cn/service/webservice/FundManagerService?wsdl"; //开户
private static String namespace="http://webservice.invest.com/"; //命名空间
public static void main(String[] args) {
try {
System.setProperty("javax.net.ssl.keyStore","D:/public/test2.keystore"); //p12文件生成(需要导入到浏览器的)
System.setProperty("javax.net.ssl.trustStore","D:/public/test.keystore"); //server.cer生成
System.setProperty("javax.net.ssl.keyStorePassword", "123456");
System.setProperty("javax.net.ssl.trustStorePassword", "123456");
Service service =new Service();
Call call =(Call) service.createCall();
call.setTargetEndpointAddress(new URL(create_user_url));
call.setOperationName(new QName(namespace, "addUnit"));
call.addParameter("institution_id", XMLType.XSD_STRING,ParameterMode.IN);
call.addParameter("fund_id", XMLType.XSD_STRING,ParameterMode.IN);
call.addParameter("unit_name",XMLType.XSD_STRING,ParameterMode.IN);
call.addParameter("pwd",XMLType.XSD_STRING,ParameterMode.IN);
call.addParameter("operator_name",XMLType.XSD_STRING,ParameterMode.IN);
call.addParameter("operator_pwd",XMLType.XSD_STRING,ParameterMode.IN);
call.addParameter("brokerage_rate",XMLType.XSD_STRING,ParameterMode.IN);
call.addParameter("guaranteed_balance",XMLType.XSD_STRING,ParameterMode.IN);
call.addParameter("credit_balance",XMLType.XSD_STRING,ParameterMode.IN);
call.setReturnClass(Element.class);
Object[] param={"1","1","fusp",TongHuaShunUtils.encryption("fsp88927"),"admin",TongHuaShunUtils.encryption("adminadmin"),"55.5","500","100"};
Object result =call.invoke(param);
Element ele = (Element) result;
Document document = ele.getOwnerDocument();
DOMImplementationLS domImplLS = (DOMImplementationLS) document.getImplementation();
LSSerializer serializer = domImplLS.createLSSerializer();
String str = serializer.writeToString(ele);
System.out.println(str);
} catch (Exception e) {
e.printStackTrace();
}
}
这里的命名空间:当你用浏览器可以正常访问webs的时候,copy里面的namespace值。
其他需要注意的地方:
call.setReturnClass需要设置正确。
invoke后的返回值result,不清楚的时候最好定义为obj,然后慢慢解析,如果写错类型,调用也会失败的。