在之前的开发过程中使用了jdk生成WebService客户端文件,然后通过文件调用接口,这种方式使用比较简单,但是我遇到了一个问题,就是传递参数传不过去,并且外部接口报500服务器内部异常。

详细情况如下:
通常的webService接口是尾缀为 ?wsdl的接口,这种接口直接在网页中打开就可以看到此接口的结构入参出参等内容。这种接口通过创建webService客户端文件,然后创建webService服务对象,调用服务方法。

        URL url = ResourceUtils.getURL(webServiceURL);客户端文件的Service service = new 客户端文件的Service(url);方法返回值类型对象 point = service.调用客户端文件Service中带有@WebEndpoint注解的方法();

这种方法创建了point对象后,就可以组参数,调用接口方法了。

但是发现生产上此方法不可行,调用时接口报500异常,参数也传递不过去。
原因为带有?wsdl后缀的接口为路径地址,无此后缀的接口为路由地址
路由地址在网页中打开是没有结构显示的,所以需要更换访问方式。
我就采用了如下方式进行webService接口访问

1.首先导入httpclient依赖

        <dependency><groupId>commons-httpclient</groupId><artifactId>commons-httpclient</artifactId><version>3.1</version></dependency>

2.拼接需要的入参,我是通过soapUI调用后,得到的入参结构,然后进行拼接。

 StringBuffer sbBuffer = new StringBuffer();//地址sbBuffer.append("<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:cre=\"service地址\">");sbBuffer.append("<soapenv:Header/>");sbBuffer.append("<soapenv:Body>");sbBuffer.append("<cre:接口名>");sbBuffer.append("<入参标签开始>");sbBuffer.append("<参数标签>"+reservoirOrder.getAuart()+"</参数标签>");sbBuffer.append("</入参标签结束>");sbBuffer.append("</cre:方法名>");sbBuffer.append("</soapenv:Body>");sbBuffer.append("</soapenv:Envelope>");return sbBuffer.toString();

3.进行接口调用

        byte[] b;//用来装入参HttpClient httpClient = new HttpClient();//创建http客户端PostMethod postMethod = new PostMethod(createLibOrderFromOEMToLESUrl);//将接口地址放入创建post请求try {postMethod.setRequestHeader("Connection", "close");//不需要请求头//调用入参拼接方法String soapRequestData = subLogisticsData(入参);//调用步骤2方法获得入参b = soapRequestData.getBytes("utf-8");//将入参转换为字符串数组InputStream is = new ByteArrayInputStream(b, 0, b.length);//将数组转换为输入流//将输入流转换为请求的对象RequestEntity re = new InputStreamRequestEntity(is, b.length, "application/soap+xml; charset=utf-8");//将请求对象放入创建的post请求中postMethod.setRequestEntity(re);//通过http客户端进行接口调用int statusCode = httpClient.executeMethod(postMethod);//返回请求码为200则调用成功if (200 == statusCode) {//获得响应的内容字符串String getServerData = postMethod.getResponseBodyAsString();//进行内容解析AddReservoirOrderDto reservoirOrderDto = this.saxLogisticsData(getServerData);return WebResultDto.success();}} catch (Exception e) {return WebResultDto.error(e.getMessage());} finally{//释放请求连接postMethod.releaseConnection();}return WebResultDto.error("调用错误");

4.解析响应内容

            //创建XML解析器对象SAXReader saxReader = new SAXReader();try {//data为响应的字符串,创建输入流,进行读取Document doc = saxReader.read(new ByteArrayInputStream(data.getBytes("UTF-8")));//获取根节点元素下的所有子元素Element root = doc.getRootElement();//一层一层打开Element body = root.element("Body");Element response = body.element("Method");Element output  = response.element("OUTPUT");//想要得到元素的值就使用getText()方法output.element("元素1").getText();output.element("元素2").getText();}catch (UnsupportedEncodingException | DocumentException e) {}

解析后将响应内容返回。

用此方法就可以正常进行调用了。
这里的处理回参进行接收的方法提交后提示不安全,这里介绍一个新的方式来处理回参。可能代码略有不同,如有问题请私聊我解决。

    public AddReservoirOrderDto saxLogisticsData(String data) {AddReservoirOrderDto reservoirOrderDto = new AddReservoirOrderDto();DocumentBuilderFactory df = DocumentBuilderFactory.newInstance();df.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliantdf.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // complianttry {DocumentBuilder builder = df.newDocumentBuilder();Document doc = builder.parse(new ByteArrayInputStream(data.getBytes(StandardCharsets.UTF_8)));NodeList nodeList = doc.getElementsByTagName("OUTPUT").item(0).getChildNodes();for (int i = 0; i < nodeList.getLength(); i++) {if ("元素1".equals(nodeList.item(i).getNodeName())) {reservoirOrderDto.setVbeln(nodeList.item(i).getTextContent());}if ("元素2".equals(nodeList.item(i).getNodeName())) {reservoirOrderDto.setMessage(nodeList.item(i).getTextContent());}}} catch (ParserConfigurationException | SAXException | IOException e) {e.printStackTrace();}return reservoirOrderDto;}

WebService调用接口传参失败问题解决相关推荐

  1. springboot版本升级导致webservice调用失败org.apache.cxf.common.jaxb.JAXBUtils.createMininumEscapeHandle

    很感谢这位作者的文章https://blog.csdn.net/q340505050518/article/details/105394315 近期对项目版本进行升级 原项目版本 从 Springcl ...

  2. webservice接口:Python调用 响应xml解析失败。

    问题:使用python的suds库请求服务,响应xml解析失败,但是使用soupUI调用是成功的. 解决: soupUI请求中含xml数据,需要将xml的外围增加 <![CDATA[xml]]& ...

  3. 接口传参为formData类型,实现文件/图片上传功能

    接口传参为formData类型,实现文件/图片上传功能 摘要: 前端小白工作中第一次遇到了上传图片的需求,一看后台接口需要传formData类型参数. const formData = new win ...

  4. 带有CAN模块通讯的labview转化为应用程序(exe)CAN模块启动失败问题解决办法

    带有CAN模块通讯的labview转化为应用程序(exe)CAN模块启动失败问题解决办法 问题原因:labview把exe视为额外的一层目录,因此相对路径的各部分(如DLL库函数)无法正常加载运行. ...

  5. xml转json以及调用websrvices传参

    目录 一.xml格式的字符串转换成json格式 二.调用webservices接口传参 一.xml格式的字符串转换成json格式 在调用webservices接口时后台返回的是xml格式的字符串,前端 ...

  6. Aero开启失败问题解决

    Aero开启失败问题解决 症状: 1. 桌面右键->Personalize(个性化)->发现窗口颜色已经变成了basic.按下window键,输入aero.然后有个trouble shoo ...

  7. QT5.5编译程序无法启动,报应用程序正常初始化 0xc0000135 失败问题解决一例

    QT5.5编译程序无法启动,报应用程序正常初始化 0xc0000135 失败问题解决一例 昨天同事碰到一个古怪的问题,也许是程序员常见的问题,在自己的PC上,程序能够很好的运行,但是拷贝到别人的机器上 ...

  8. 通过WebService调用SQLXML(SQL Server 2005) [ZT]

    [翻译]通过WebService调用SQLXML(SQL Server 2005) 原文发布日期:2007.02.04 作者:Russ Quinn 翻译:webabcd 介绍 我最近需要给用户创建一个 ...

  9. shiro realm 注解失败问题解决过程

    shiro realm 注解失败问题解决过程 参考文章: (1)shiro realm 注解失败问题解决过程 (2)https://www.cnblogs.com/ASPNET2008/p/55072 ...

  10. xmanager 开启X11转发失败问题解决

    xmanager 开启X11转发失败问题解决 参考文章: (1)xmanager 开启X11转发失败问题解决 (2)https://www.cnblogs.com/xuelangos/p/107862 ...

最新文章

  1. 快速人群密度估计--Multi-scale Convolutional Neural Networks for Crowd Counting
  2. LeetCode题目:两数之和2
  3. 普通用户 fork报错 fork: retry: No child processes 解决方法
  4. Java成员方法遵循动态绑定机制
  5. python神经网络教程16_Python深度学习之神经网络视频
  6. 中间介(MiddleWare)
  7. 前端学习(2455):layout处理
  8. The eighteen day
  9. R语言学习笔记:简单的回归分析
  10. 如何下载英文原版书籍资料
  11. multisim安装后无法连接数据库_如何解决multisim无法安装的问题
  12. 中国低线城市洞察综述
  13. 太阳系行星运行图-java多媒体实验
  14. 【JY】浅析各动力求解算法及其算法数值阻尼(人工阻尼)
  15. 【Python 3.7】序数:序数表示位置,如 1st和 2nd。大多数序数都以 th结尾,只有 1、2和 3 例外。
  16. 知道创宇发布统一云防御,“开明兽”亮相“山海·创”
  17. APIAuto——敏捷开发最强大易用的 HTTP 接口工具 (二)
  18. 空调主板电路设计特点
  19. Linux用户空间线程管理介绍之二:创建线程堆栈
  20. element ui 基本操作

热门文章

  1. 单片机c语言出租车计时程序,基于单片机的出租车计费(c语言
  2. 锁存器芯片74HC573芯片的用法,及其在实际电路中的应用
  3. Zynq7020 PS 软件复位
  4. fu7推挽胆机音质_fu7电子管功放电路图大全(6N8P\6P3P\胆机功放电路\耦合电容器) - 全文...
  5. 音频功率放大器,250种功放电路图集锦,文件是JPG文件
  6. 如何测试webservice接口
  7. 尚学堂马士兵_Struts2下载完成
  8. JSP基础教程-初时index首页
  9. 笔记本W10找不到端口(com口)及单片机串口连接的问题(附51开发板的CH340串口芯片的驱动程序安装包)
  10. Unity与UE4引擎源码内使用到的第三方库的比较