首页 > 编程知识 正文

webservice接口调用传参,调用服务器失败

时间:2023-05-05 07:54:14 阅读:62814 作者:3612

在以前的开发中,使用jdk生成web服务的客户端文件和从文件调用接口的方法很简单,但不能传递参数,外部接口为500

详细情况如下。

常规web服务接口在末尾? 在网页上直接打开时,可以看到结构入参、http://www.com/、出参等的内容的wsdl界面该接口通过创建webService客户端文件,然后创建webService服务对象来调用服务方法。

URL URL=resource utils.geturl (web服务URL ); 客户端文件的服务服务=新客户端文件的服务(URL ); 方法返回类型对象point=Service .客户端文件service中具有@WebEndpoint注释的方法(以这种方式创建point对象时,可以对参数进行分组和接口

但是,在生产上发现该方法是不可能的,调用时接口报告500异常,参数也无法传递。

理由是什么? wsdl后缀的接口为路径地址,没有此后缀的接口为路由地址

路由地址在网页上为没有结构显示,因此需要更改访问方法。

我通过以下方法访问了web服务接口

1 .首先引入http客户端依赖

ependencygroupidcommons-http客户端/groupidartifactidcommons-http客户端/artifactidversion 3.1/version/dependency 2.

stringbuffersbbuffer=new string buffer (; //地址sb buffer.append (soap env : envelope xmlns : soap env=(http://方案. XML soap.org/soap/envelope/() ) ) sb buffer.append (' soap env : header/'; sb buffer.append (soap env : body ); bbuffer.append(cre:接口名称); sbBuffer.append ('开始加入标签'); sbBuffer.append (参数标签(reservoirOrder.getAuart ) ) /参数标签); sbbuffer.append () /加入标签结束) ); sbbuffer.append(/cre:方法名称); sb buffer.append (/soap env : body ); sb buffer.append (/soap env : envelope ); return sbBuffer.toString (; 3 .进行接口调用

byte[] b; //用于加载参考http客户端http客户端=new http客户端(; 创建用于创建http客户端postmethodpostmethod=new post method (createliborderfromoemtolesurl )的post请求try { post method.setrequest quemtolesurl //无需要求头//准入拼接方法stringsoaprequestdata=sublogisticsdata (准入); //调用步骤2中的方法以获取条目b=soaprequestdata.getbytes (utf-8 ); //将参数转换为字符串数组inputstream is=newbytearrayinputstream (b,0,b.length )//将数组转换为输入流//将输入流转换为请求的对象

Entity(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, ""); // Compliant df.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant try { 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; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。