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类如下图:
java对接webservice接口的四种方式,后台框架,接口相关,java,python,开发语言

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

		String result = "";
		NC65To63ProjectService service = new NC65To63ProjectService();
		NC65To63ProjectServicePortType servicePort =service.
				getNC65To63ProjectServiceSOAP11PortHttp(); 
		result = servicePort.receiptProject(json);

方式三:使用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();
		}

 // 第二种方法 ----------------------------------------------
// 被<![CDATA[]]>这个标记所包含的内容将表示为纯文本 
String xmlData = "<![CDATA[<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + 
"<accounts>" + 
"<account>" + 
"<accId>帐号ID(必填)</accId>" + 
"<userPasswordMD5>密码</userPasswordMD5>" + 
"<userPasswordSHA1>密码</userPasswordSHA1>" + 
"其中userPasswordSHA1标签代表SHA1加密后的密码,userPasswordMD5标签代表MD5加密后的密码" + 
"<name>姓名</name>" + 
"<sn>姓</sn>" + 
"<description>描述 </description>" + 
"<email>邮箱 </email>" + 
"<gender>性别</gender>" + 
"<telephoneNumber>电话号码</telephoneNumber>" + 
"<mobile>移动电话</mobile>" + 
"<startTime>用户的开始生效时间(YYYY-MM-DD HH:mm:SS)</startTime>" + 
"<endTime>用户结束生效时间(YYYY-MM-DD HH:mm:SS) </endTime>" + 
"<idCardNumber>身份证号码</idCardNumber>" + 
"<employeeNumber>工号 </employeeNumber>" + 
"<o>用户所属的组织的编码号 </o>" + 
"<employeeType>用户类型</employeeType>" + 
"<supporterCorpName>所在公司名称 </supporterCorpName>" + 
"</account>" + 
"</accounts>]]>";

//调用方法
String method = "sayHello";
   method = "getUserList";
   
String data="<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ser=\"http://impl.webservice.platform.hotent.com/\">"+
   "<soapenv:Body>"+
      "<ser:"+method+">"+
         "<arg0>"+ xmlData + "</arg0>"+
      "</ser:"+method+">"+
   "</soapenv:Body>"+
"</soapenv:Envelope>";
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("<", "&lt;").replaceAll(">", "&gt;").replaceAll(" ", "&nbsp;").replaceAll("\"", "&quot;");
return newXml;
}

总结

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

第二种apache-cxf生成java类调用的方式,直接调用生成的类即可访问接口,非常方便,但是apache-cxf和jdk有兼容问题,如果关联的某个jar包中的代码有冲突,就会遇到痛苦的报错了。在我的尝试中,就有一个Service冲突的问题,网上说需要更改某jar包中的class文件,但是由于项目太过庞大,担心会触发其他的问题,所以我只能就此作罢。

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

第四种:

httpclient本人亲测好用。不用引用cxf或AXIS一大堆jar包,比较方便文章来源地址https://www.toymoban.com/news/detail-698711.html

到了这里,关于java对接webservice接口的四种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java Map集合里面取键和值的四种方式

    使用Map的keySet()方法获取键集合,再使用forEach循环遍历键集合,通过Map的get()方法获取对应的值。例如: 使用Map的values()方法获取值集合,再使用forEach循环遍历值集合。例如: 使用Map的entrySet()方法获取键值对集合,再使用forEach循环遍历键值对集合,通过Entry的getKey()方法获取

    2024年01月15日
    浏览(43)
  • Java 实现 HTTP 请求的四种方式,你都学会了么?

    前言 在日常工作和学习中,有很多地方都需要发送HTTP请求,本文以Java为例,总结发送HTTP请求的多种方式 HTTP请求实现过程 GET 创建远程连接 设置连接方式(get、post、put…) 设置连接超时时间 设置响应读取时间 发起请求 获取请求数据 关闭连接 POST 创建远程连接 设置连接方

    2024年02月08日
    浏览(46)
  • Java创建数组、赋值的四种方式,声明+创建+初始化 详解

    以int数据类型为例 注意: new 数据类型[]{},其中花括号可以省去,但要在[ ]中填写数组的个数; 创建多维数组时 new后面第一个方括号中的元素数量不能省略 1、一维数组的声明方式: type[] arrayName; 或 type arrayName[]; 推荐使用第一种格式,因为第一种格式具有更好的可读性,表

    2024年04月11日
    浏览(55)
  • java基础:初始化ArrayList时直接赋值的四种方式

    在Java中,初始化ArrayList时直接赋值有以下几种常见方式: 构造器传入集合 : 或者在Java 9及以上版本中使用 List.of() 方法创建不可变列表: 使用匿名内部类 (不常用且可能引起混淆,实际编程中很少这样用): 注意:这种方式利用了匿名内部类的实例初始化块,但不是标准

    2024年04月22日
    浏览(41)
  • c#对接webservice接口

    方式一:需要填写地址,不能映射每个方法 工具类 调用方法: 方式二:需要提前写好方法名,调用简单像调用类方法一样 调用方式:

    2024年02月08日
    浏览(48)
  • Java 客户端调用 WebService 接口的一种方式

      通过SoapUI创建一个SOAP Project;   项目名称自定义,WSDL地址维护WebService接口地址。点击OK即可   项目创建完成后,展开WebService项,可以看到具体的接口,打开接口下的Request,右侧面板Form标签下可以清晰的看到请求入参,点击Submit请求按钮可以看到Overview标签下的响应结

    2024年01月18日
    浏览(48)
  • View 的四种 OnClick 方式

    嗨喽,大家好!今天呢,我跟大家聊一聊Android 的View 的点击事件onClick 。额,有点拗口(^_^) 。 看过我的文章的人可能会好奇,你怎么写Android的文章了啊?说起这啊,就是我的血泪史了,此处省略一万字.................... 废话不多说,让我们代码走起,风里来,雨里去,唯有代

    2023年04月15日
    浏览(42)
  • 创建多线程的四种方式

    ① 创建一个类继承 Thread 类,重写 run() 方法 ② 调用 start() 方法启动线程 例: ① 创建类实现 Runnable 接口,重写 run() 方法 ② 以实现类作为构造器参数,创建一个线程( Thread )对象 ③ 调用 start() 方法启动线程 例 注意:实现Runnable接口方式中,调用的不是Thread类的run()方法

    2024年02月10日
    浏览(45)
  • CSS中的四种定位方式

    在CSS中定位有以下4种: 静态定位 - static 相对定位 - relative 绝对定位 - absolute 固定定位 - fixed 静态定位是css中的默认定位方式,也就是没有定位。在此定位方式中设置:top,bottom,left,right,z-index 这些属性都是无效的。 相对位置前的位置: 相对位置后的位置: 可以看到该

    2024年02月08日
    浏览(85)
  • JavaScript中的四种枚举方式

    字符串和数字具有无数个值,而其他类型如布尔值则是有限的集合。 一周的日子(星期一,星期二,...,星期日),一年的季节(冬季,春季,夏季,秋季)和基本方向(北,东,南,西)都是具有有限值集合的例子。 当一个变量有一个来自有限的预定义常量的值时,使用

    2024年02月03日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包