java对接webservice接口的四种方式

java对接webservice接口的四种方式

这两天一直在做外系统对接,对方的接口是webservice的形式,调用起来有些蛋疼,于是在这里记录一下我尝试过的调用WebService的四种方式。

方式一:以HttpURLConnection的方式调用

String url ="http://127.0.0.1/cwbase/Service/hndg/Hello.asmx?wsdl";

URL realURL = new URL(url);

HttpURLConnection connection = (HttpURLConnection) realURL.openConnection();

connection.setDoOutput(true);

connection.setDoInput(true);

connection.setRequestProperty("Content-Type", "text/xml; charset=UTF-8");

connection.setRequestProperty("content-length",String.valueOf(xmlData.length));

connection.setRequestMethod("POST");

DataOutputStream printOut = new DataOutputStream(connection.getOutputStream());

printOut.write(xmlOutString.getBytes("UTF-8"));//xmlOutString是自己拼接的xml,这种方式就是通过xml请求接口

printOut.flush();

printOut.close();

// 从连接的输入流中取得回执信息

InputStream inputStream = connection.getInputStream();

InputStreamReader isr = new InputStreamReader(inputStream,"UTF-8");

BufferedReader bufreader = new BufferedReader(isr);

String xmlString = "";

int c;

while ((c = bufreader.read()) != -1) {

xmlString += (char) c; }

isr.close();

//处理返回的xml信息

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

DocumentBuilder db = dbf.newDocumentBuilder();

Document d = db.parse(new ByteArrayInputStream(xmlString.getBytes("UTF-8")));

//从对方的节点中取的返回值(节点名由对方接口指定)

String returnState = d.getElementsByTagName("ReturnStatus").item(0).getFirstChild().getNodeValue();

方式二:使用apache-cxf生成java类调用

下载apache-cxf并配置环境变量(参照JAVA环境变量配置),配置成功后cmd输入wsdl2java -help即可验证是否成功。 接着在cmd中输入wsdl2java -encoding utf-8 -d 生成路径 接口地址,即可在指定路径生成接口JAVA文件,生成后的JAVA类如下图:

生成以后调用起来就很简单了,例子如下:

String result = "";

NC65To63ProjectService service = new NC65To63ProjectService();

NC65To63ProjectServicePortType servicePort =service.

getNC65To63ProjectServiceSOAP11PortHttp();

result = servicePort.receiptProject(json);

这个是我自己用过的cxf demo欢迎下载在同一个系统里用cxf 实现SOAP 协议和RESTful风格 两种类型的webservice接口(含简单demo)_gsoap restful和soap共存-CSDN博客

方式三:使用AXIS调用WebService

import org.apache.axis.client.Service;

import org.apache.axis.client.Call;

import org.apache.axis.encoding.XMLType;

import javax.xml.namespace.QName;

import javax.xml.rpc.ParameterMode;

String result = "";

String url = "http://127.0.0.1/uapws/service/nc65to63projectsysplugin";//这是接口地址,注意去掉.wsdl,否则会报错

Service service = new Service();

Call call = (Call) service.createCall();

call.setTargetEndpointAddress(url);

String parametersName = "string";//设置参数名

call.setOperationName("receiptProject");//设置方法名

call.addParameter(parametersName, XMLType.XSD_STRING, ParameterMode.IN);//方法参数,1参数名、2参数类型、3.入参

call.setReturnType(XMLType.XSD_STRING);//返回类型

String str = json;

Object resultObject = call.invoke(new Object[] { str });//调用接口

result = (String) resultObject;

方式四:使用httpclient

public static void main(String args[]) {

// 第一种方法 ----------------------------------------------

JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();

// 创建客户端连接

Client client = factory.createClient("http://127.0.0.1:8080/xx/service/userOrg?wsdl");

Object[] res = null;

try {

QName operationName = new QName("http://impl.webservice.userorg.com/","findUser");//如果有命名空间需要加上这个,第一个参数为命名空间名称,调用的方法名称

res = client.invoke(operationName, "admin");//后面为WebService请求参数数组

System.out.println(res[0]);

}catch (Exception e) {

e.printStackTrace();

}

// 第二种方法 ----------------------------------------------

// 被这个标记所包含的内容将表示为纯文本

String xmlData = "" +

"" +

"" +

"帐号ID(必填)" +

"密码" +

"密码" +

"其中userPasswordSHA1标签代表SHA1加密后的密码,userPasswordMD5标签代表MD5加密后的密码" +

"姓名" +

"" +

"描述 " +

"邮箱 " +

"性别" +

"电话号码" +

"移动电话" +

"用户的开始生效时间(YYYY-MM-DD HH:mm:SS)" +

"用户结束生效时间(YYYY-MM-DD HH:mm:SS) " +

"身份证号码" +

"工号 " +

"用户所属的组织的编码号 " +

"用户类型" +

"所在公司名称 " +

"" +

"]]>";

//调用方法

String method = "sayHello";

method = "getUserList";

//此data的结构要用soapui去查看,然后参数拼接进来

String data=""+

""+

""+

""+ xmlData + ""+

""+

""+

"";

String httpUrl="http://127.0.0.1:8080/xx/service/helloWorld?wsdl";

httpUrl="http://127.0.0.1:8080/xx/service/userOrg?wsdl";

try {

//第一步:创建服务地址

URL url = new URL(httpUrl);

//第二步:打开一个通向服务地址的连接

HttpURLConnection connection = (HttpURLConnection) url.openConnection();

//第三步:设置参数

//3.1发送方式设置:POST必须大写

connection.setRequestMethod("POST");

//3.2设置数据格式:content-type

connection.setRequestProperty("content-type", "text/xml;charset=utf-8");

//3.3设置输入输出,因为默认新创建的connection没有读写权限,

connection.setDoInput(true);

connection.setDoOutput(true);

//第四步:组织SOAP数据,发送请求

String soapXML = data;

//将信息以流的方式发送出去

// DataOutputStream.writeBytes将字符串中的16位的unicode字符以8位的字符形式写到流里面

OutputStream os = connection.getOutputStream();

os.write(soapXML.getBytes());

//第五步:接收服务端响应,打印

int responseCode = connection.getResponseCode();

System.out.println("responseCode: "+responseCode);

if(200 == responseCode){//表示服务端响应成功

//获取当前连接请求返回的数据流

InputStream is = connection.getInputStream();

InputStreamReader isr = new InputStreamReader(is);

BufferedReader br = new BufferedReader(isr);

StringBuilder sb = new StringBuilder();

String temp = null;

while(null != (temp = br.readLine())){

sb.append(temp);

}

is.close();

isr.close();

br.close();

System.out.println(StringEscapeUtils.unescapeXml(sb.toString())); //转义

System.out.println(sb.toString());

} else { //异常信息

InputStream is = connection.getErrorStream(); //通过getErrorStream了解错误的详情,因为错误详情也以XML格式返回,因此也可以用JDOM来获取。

InputStreamReader isr = new InputStreamReader(is,"utf-8");

BufferedReader in = new BufferedReader(isr);

String inputLine;

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(

new FileOutputStream("d:\\result.xml")));// 将结果存放的位置

while ((inputLine = in.readLine()) != null)

{

System.out.println(inputLine);

bw.write(inputLine);

bw.newLine();

bw.close();

}

in.close();

}

os.close();

} catch (Exception e) {

System.out.println(e.getMessage());

}

}

// 把xml转义

public static String escapeXml(String xml) {

String newXml = xml.replaceAll("<", "<").replaceAll(">", ">").replaceAll(" ", " ").replaceAll("\"", """);

return newXml;

}

总结

第一种使用HttpURLConnection调用的方法,基本不用担心什么兼容问题,但是通过xml请求接口,需要自己手动拼接xml(一般通过soapui生成,然后在程序中根据情况拼接),并且返回的数据也是xml,还要通过代码解析,可以说是极其麻烦了。

第二种apache-cxf生成java类调用的方式,直接调用生成的类即可访问接口,非常方便,但是apache-cxf和jdk有兼容问题,在解决完兼容问题用起来也非常舒服,能提供webservice接口,也能对接webservcie接口

第三种AXIS的方式, 没有啥兼容问题的方式了,调用起来非常简便,不需要拼接xml,返回的也只能干净的数据,能提供webservice接口,也能对接webservcie接口

第四种:

httpclient在只对接webservice接口时比较推荐。不用引用cxf或AXIS一大堆jar包,比较方便

这里主要提供解决思路,除了第二,第四种别的代码并不是太全,想好用哪种之后可以再搜搜别家的文章具体怎么实现的

相关推荐

华硕 ROG组装电脑DIY游戏主机 仅需27999元
正规det365登录网站

华硕 ROG组装电脑DIY游戏主机 仅需27999元

🎯 10-12 💯 210
京东支付是什么意思?盘点京东支付的方式包括哪些
正规det365登录网站

京东支付是什么意思?盘点京东支付的方式包括哪些

🎯 07-11 💯 566
魔兽军衔星期几更新 军衔更新时间和规则介绍
365bet赌城投注

魔兽军衔星期几更新 军衔更新时间和规则介绍

🎯 09-20 💯 861