文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java对接webservice接口的四种方式

2023-10-21 07:11

关注

这两天一直在做外系统对接,对方的接口是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);

方式三:使用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";   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有兼容问题,如果关联的某个jar包中的代码有冲突,就会遇到痛苦的报错了。在我的尝试中,就有一个Service冲突的问题,网上说需要更改某jar包中的class文件,但是由于项目太过庞大,担心会触发其他的问题,所以我只能就此作罢。

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

第四种:

httpclient本人亲测好用。不用引用cxf或AXIS一大堆jar包,比较方便

来源地址:https://blog.csdn.net/zhaofuqiangmycomm/article/details/132732402

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯