WebService调用接口传参失败问题解决
在之前的开发过程中使用了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调用接口传参失败问题解决相关推荐
- springboot版本升级导致webservice调用失败org.apache.cxf.common.jaxb.JAXBUtils.createMininumEscapeHandle
很感谢这位作者的文章https://blog.csdn.net/q340505050518/article/details/105394315 近期对项目版本进行升级 原项目版本 从 Springcl ...
- webservice接口:Python调用 响应xml解析失败。
问题:使用python的suds库请求服务,响应xml解析失败,但是使用soupUI调用是成功的. 解决: soupUI请求中含xml数据,需要将xml的外围增加 <![CDATA[xml]]& ...
- 接口传参为formData类型,实现文件/图片上传功能
接口传参为formData类型,实现文件/图片上传功能 摘要: 前端小白工作中第一次遇到了上传图片的需求,一看后台接口需要传formData类型参数. const formData = new win ...
- 带有CAN模块通讯的labview转化为应用程序(exe)CAN模块启动失败问题解决办法
带有CAN模块通讯的labview转化为应用程序(exe)CAN模块启动失败问题解决办法 问题原因:labview把exe视为额外的一层目录,因此相对路径的各部分(如DLL库函数)无法正常加载运行. ...
- xml转json以及调用websrvices传参
目录 一.xml格式的字符串转换成json格式 二.调用webservices接口传参 一.xml格式的字符串转换成json格式 在调用webservices接口时后台返回的是xml格式的字符串,前端 ...
- Aero开启失败问题解决
Aero开启失败问题解决 症状: 1. 桌面右键->Personalize(个性化)->发现窗口颜色已经变成了basic.按下window键,输入aero.然后有个trouble shoo ...
- QT5.5编译程序无法启动,报应用程序正常初始化 0xc0000135 失败问题解决一例
QT5.5编译程序无法启动,报应用程序正常初始化 0xc0000135 失败问题解决一例 昨天同事碰到一个古怪的问题,也许是程序员常见的问题,在自己的PC上,程序能够很好的运行,但是拷贝到别人的机器上 ...
- 通过WebService调用SQLXML(SQL Server 2005) [ZT]
[翻译]通过WebService调用SQLXML(SQL Server 2005) 原文发布日期:2007.02.04 作者:Russ Quinn 翻译:webabcd 介绍 我最近需要给用户创建一个 ...
- shiro realm 注解失败问题解决过程
shiro realm 注解失败问题解决过程 参考文章: (1)shiro realm 注解失败问题解决过程 (2)https://www.cnblogs.com/ASPNET2008/p/55072 ...
- xmanager 开启X11转发失败问题解决
xmanager 开启X11转发失败问题解决 参考文章: (1)xmanager 开启X11转发失败问题解决 (2)https://www.cnblogs.com/xuelangos/p/107862 ...
最新文章
- 快速人群密度估计--Multi-scale Convolutional Neural Networks for Crowd Counting
- LeetCode题目:两数之和2
- 普通用户 fork报错 fork: retry: No child processes 解决方法
- Java成员方法遵循动态绑定机制
- python神经网络教程16_Python深度学习之神经网络视频
- 中间介(MiddleWare)
- 前端学习(2455):layout处理
- The eighteen day
- R语言学习笔记:简单的回归分析
- 如何下载英文原版书籍资料
- multisim安装后无法连接数据库_如何解决multisim无法安装的问题
- 中国低线城市洞察综述
- 太阳系行星运行图-java多媒体实验
- 【JY】浅析各动力求解算法及其算法数值阻尼(人工阻尼)
- 【Python 3.7】序数:序数表示位置,如 1st和 2nd。大多数序数都以 th结尾,只有 1、2和 3 例外。
- 知道创宇发布统一云防御,“开明兽”亮相“山海·创”
- APIAuto——敏捷开发最强大易用的 HTTP 接口工具 (二)
- 空调主板电路设计特点
- Linux用户空间线程管理介绍之二:创建线程堆栈
- element ui 基本操作
热门文章
- 单片机c语言出租车计时程序,基于单片机的出租车计费(c语言
- 锁存器芯片74HC573芯片的用法,及其在实际电路中的应用
- Zynq7020 PS 软件复位
- fu7推挽胆机音质_fu7电子管功放电路图大全(6N8P\6P3P\胆机功放电路\耦合电容器) - 全文...
- 音频功率放大器,250种功放电路图集锦,文件是JPG文件
- 如何测试webservice接口
- 尚学堂马士兵_Struts2下载完成
- JSP基础教程-初时index首页
- 笔记本W10找不到端口(com口)及单片机串口连接的问题(附51开发板的CH340串口芯片的驱动程序安装包)
- Unity与UE4引擎源码内使用到的第三方库的比较