在以前的开发中,使用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) { }解析后将响应内容返回。
用此方法就可以正常进行调用了。
这里的处理回参进行接收的方法提交后提示不安全,这里介绍一个新的方式来处理回参。可能代码略有不同,如有问题请私聊我解决。