搜索
首页Javajava教程使用URLConnection和axis1.4开发webservice教程
使用URLConnection和axis1.4开发webservice教程Jul 18, 2017 pm 06:00 PM
urlconnectionweb

写在前面:

  调用webservice的方式有很多:1.直接在客户端使用工具生成客户端代码,将代码拷进项目中调用即可;2.使用对应的webservice框架来进行调用,比如如果我们我的服务端开发用的是axis,那么我在客户端也可以导入相应的axis的jar包,然后用它相关的方法来进行调用;3.js调用;4.URLConnection调用。上面的前两种方式个人认为比较适用于服务端与客户端都是java开发系统,如果是不同语言的调用那就不好说了。而第三种与第四种的方式其实差不多,如果在jsp页面中就要调用接口,就用js这种方式,如果需要在后台写程序来调用,就比较推荐URLConnection了(现在只是会用,其实它的一些原理什么的我还是很模糊,比如这种方式应该是http??调用??,还不是很清楚呢)

  最近项目要开发webservice接口,但是jdk是1.4。故选择了axis1.4来进行开发(只有这个比较适合项目的环境)。

  

  这里我也是用的java语言来做测试的,是可以调用的。解析服务端返回的数据需要用到相关jar包:

  代码:

package edu.hue.client;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.StringReader;import java.net.HttpURLConnection;import java.net.ProtocolException;import java.net.URL;import java.net.URLConnection;import java.util.List;import org.dom4j.Document;import org.dom4j.Element;import org.dom4j.io.SAXReader;public class XMLClient2 {public static void main(String[] args) {try {//创建url地址URL url = new URL("http://10.203.138.82:8080/test_axis3/services/sayHello?wsdl");//打开连接URLConnection conn = url.openConnection();//转换成HttpURLHttpURLConnection httpConn = (HttpURLConnection) conn;
                
                System.setProperty("sun.net.client.defaultConnectTimeout", "30000");
                System.setProperty("sun.net.client.defaultReadTimeout", "30000");                //打开输入输出的开关httpConn.setDoInput(true);
                httpConn.setDoOutput(true);//post提交不能有缓存httpConn.setUseCaches(false);                //设置请求方式httpConn.setRequestMethod("POST");                //设置请求的头信息httpConn.setRequestProperty("Content-type", "text/xml;charset=UTF-8");                //设置 SOAPAction Header  不然 报错 没有这个soapaction headerhttpConn.setRequestProperty("SOAPAction", "");                //拼接请求消息  这里的请求消息体 直接用接口测试工具 soapui 来获取  然后拼接以下 注意双引号这里要转义成\" String data = "<soapenv:Envelope xmlns:soapenv=" +
                        "\"http://schemas.xmlsoap.org/soap/envelope/\" " +
                        "xmlns:ser=\"http://server.hue.edu/\" " +
                        "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +
                        "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"//+"<soapenv:Header />"  +"<soapenv:Body>"
                            +"<ser:say soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"
                        +"<name xsi:type=\"soapenc:string\" xs:type=\"type:string\" xmlns:soapenc=\"http://schemas.xmlsoap.org/soap/encoding/\" xmlns:xs=\"http://www.w3.org/2000/XMLSchema-instance\">" 
                            +"小蚊子qq:513996980" //这里是直接在soapui中复制过来的所以它的请求消息体比较长 也可以用下面这种 注释的方式来拼接+"</name>"
                        +"</ser:say>"
                        +"</soapenv:Body>"
                      +"</soapenv:Envelope>";            
                 /*    下面这种请求消息体更为简单 经过测试也可以成功 它的方法名 参数名 都很简洁  
                  * 但是为了保险 希望大家在写请求消息体的时候用 接口测试工具去获取比如soapui 然后直接复制过来    
                      String data = "<soapenv:Envelope xmlns:soapenv=" +
                        "\"\" " +
                        "xmlns:ser=\"http://server.hue.edu/\" " +
                        "xmlns:xsd=\"\" " +
                        "xmlns:xsi=\"\">"
                        +"<soapenv:Header />"
                        +"<soapenv:Body>"
                        +"<ser:say >"
                            +"<name>小蚊子qq:513996980</name>"
                        +"</ser:say>"
                        +"</soapenv:Body>"
                      +"</soapenv:Envelope>";*/    
                                          //获得输出流OutputStream out = httpConn.getOutputStream();//发送数据  这里注意要带上编码utf-8  不然 不能传递中文参数过去out.write(data.getBytes("UTF-8"));//判断请求成功if(httpConn.getResponseCode() == 200){
                    System.out.println("调用成功.....");//获得输入流InputStream in = httpConn.getInputStream();//使用输入流的缓冲区BufferedReader reader = new BufferedReader(new InputStreamReader(in,"UTF-8"));
                    StringBuffer sb = new StringBuffer();
                    String line = null;//读取输入流while((line = reader.readLine()) != null){
                        sb.append(line);
                    }                    //创建sax的读取器  这里需要导入相应的jar包SAXReader saxReader = new SAXReader();//创建文档对象Document doc = saxReader.read(new StringReader(sb.toString()));//获得请求响应return元素   这里可根据接口测试工具查看你的相应消息体的返回值的节点是什么名称 我这里是sayReturnList eles = doc.selectNodes("//sayReturn");                    for(int i=0;i<eles.size();i++){
                        Element ele = (Element)eles.get(i);
                        System.out.println(ele.getText());
                    }
                    System.out.println(sb.toString());
            }else{
          //调用不成功 打印错误的信息                //获得输入流InputStream err = httpConn.getErrorStream();//使用输入流的缓冲区BufferedReader reader = new BufferedReader(new InputStreamReader(err,"UTF-8"));
                StringBuffer sb = new StringBuffer();
                String line = null;//读取输入流while((line = reader.readLine()) != null){
                    sb.append(line);
                }
                System.out.println("返回错误码:"+httpConn.getResponseCode());
                System.out.println("返回的结果:"+sb.toString());
                    
            }
                } catch (Exception e) {
                    e.printStackTrace();
                }
}
}

  上面是客户端调用的代码,服务端这里就不多贴了,就只是一个方法,里面有一个String类型的参数。

  问题总结:

  1.报错误 说http response result code 500:

  java.io.IOException: Server returned HTTP response code: 500 for URL: http://10.203.138.82:8080/test_axis/services/sayHello
  at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1626)

  这里的500错误 一般都是你的代码有问题 哪里可能写的有点不对 这个时候就要仔细仔细再仔细 然后尝试用不同的方式去排除错误所在的地方 也要多百度 多查 ,这里我出现这个问题 是因为把输入流写在输出流的前面(对于客户端,应该是先写输出流之后,再写输入流get.InputStream())

  2.针对axis1.4的bug:AxisFault faultCode: {}Client.NoSOAPAction faultSubcode:            faultString: no SOAPAction header! faultActor: faultNode: faultDetail: {}stackTrace:no                         SOAPAction header!

         no SOAPAction header!   这里可以注意 如果报这个错 加上一行代码就好了啦 当初为了这个错误 几乎看了一两天的博客文章  但是却没有人告诉具体的代码解决办法(有两种解决办法1:在客户端加上soapaction,其具体内容不重要,写一个空的字符串也是可以的 2:服务端重写写一个servlet,与axisServlet一样,并重新改写里面的getSoapAction()方法,这里推荐只第一种,毕竟这个也算不上是axis的bug)

  //设置 SOAPAction Header  不然 报错 没有这个soapaction header
      httpConn.setRequestProperty("SOAPAction", "");

  3.如果客户端传递参数为中文就报错:变为字节数组的时候加上UTF-8

  //获得输出流
     OutputStream out = httpConn.getOutputStream();
      //发送数据  这里注意要带上编码utf-8  不然 不能传递中文参数过去
       out.write(data.getBytes("UTF-8"));

 

  疑问:

  如果方法没有参数 需要怎么调用???在这里  之前 跨平台 调用wcf开发的.net系统的时候 调用的接口方法是不需要传递参数的 但是也传了一个空的字符串过去就好了  也没有写什么soap请求消息体什么的  但是这里因为是webservice 它是基于soap的 所以这里传递数据 不管有没有参数  应该都是要写上消息请求体的 所以这里需要注意一下

  比如:

// 但是为了保险 希望大家在写请求消息体的时候用 接口测试工具去获取比如soapui 然后直接复制过来      String data = "<soapenv:Envelope xmlns:soapenv=" +
                        "\"http://schemas.xmlsoap.org/soap/envelope/\" " +
                        "xmlns:ser=\"http://server.hue.edu/\" " +
                        "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +
                        "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"
                        +"<soapenv:Header />"
                        +"<soapenv:Body>"
                        +"<ser:say >"//比如这里要调用的方法没有参数 就直接不用写就好 但是这个消息体 应该还是要的    +"</ser:say>"
                        +"</soapenv:Body>"
                      +"</soapenv:Envelope>";

 

以上是使用URLConnection和axis1.4开发webservice教程的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Web Speech API开发者指南:它是什么以及如何工作Web Speech API开发者指南:它是什么以及如何工作Apr 11, 2023 pm 07:22 PM

​译者 | 李睿审校 | 孙淑娟Web Speech API是一种Web技术,允许用户将语音数据合并到应用程序中。它可以通过浏览器将语音转换为文本,反之亦然。Web Speech API于2012年由W3C社区引入。而在十年之后,这个API仍在开发中,这是因为浏览器兼容性有限。该API既支持短时输入片段,例如一个口头命令,也支持长时连续的输入。广泛的听写能力使它非常适合与Applause应用程序集成,而简短的输入很适合语言翻译。语音识别对可访问性产生了巨大的影响。残疾用户可以使用语音更轻松地浏览

如何使用Docker部署Java Web应用程序如何使用Docker部署Java Web应用程序Apr 25, 2023 pm 08:28 PM

docker部署javaweb系统1.在root目录下创建一个路径test/appmkdirtest&&cdtest&&mkdirapp&&cdapp2.将apache-tomcat-7.0.29.tar.gz及jdk-7u25-linux-x64.tar.gz拷贝到app目录下3.解压两个tar.gz文件tar-zxvfapache-tomcat-7.0.29.tar.gztar-zxvfjdk-7u25-linux-x64.tar.gz4.对解

web端是什么意思web端是什么意思Apr 17, 2019 pm 04:01 PM

web端指的是电脑端的网页版。在网页设计中我们称web为网页,它表现为三种形式,分别是超文本(hypertext)、超媒体(hypermedia)和超文本传输协议(HTTP)。

web前端和后端开发有什么区别web前端和后端开发有什么区别Jan 29, 2023 am 10:27 AM

区别:1、前端指的是用户可见的界面,后端是指用户看不见的东西,考虑的是底层业务逻辑的实现,平台的稳定性与性能等。2、前端开发用到的技术包括html5、css3、js、jquery、Bootstrap、Node.js、Vue等;而后端开发用到的是java、php、Http协议等服务器技术。3、从应用范围来看,前端开发不仅被常人所知,且应用场景也要比后端广泛的太多太多。

深入探讨“高并发大流量”访问的解决思路和方案深入探讨“高并发大流量”访问的解决思路和方案May 11, 2022 pm 02:18 PM

怎么解决高并发大流量问题?下面本篇文章就来给大家分享下高并发大流量web解决思路及方案,希望对大家有所帮助!

web前端打包工具有哪些web前端打包工具有哪些Aug 23, 2022 pm 05:31 PM

web前端打包工具有:1、Webpack,是一个模块化管理工具和打包工具可以将不同模块的文件打包整合在一起,并且保证它们之间的引用正确,执行有序;2、Grunt,一个前端打包构建工具;3、Gulp,用代码方式来写打包脚本;4、Rollup,ES6模块化打包工具;5、Parcel,一款速度极快、零配置的web应用程序打包器;6、equireJS,是一个JS文件和模块加载器。

Python轻量级Web框架:Bottle库!Python轻量级Web框架:Bottle库!Apr 13, 2023 pm 02:10 PM

和它本身的轻便一样,Bottle库的使用也十分简单。相信在看到本文前,读者对python也已经有了简单的了解。那么究竟何种神秘的操作,才能用百行代码完成一个服务器的功能?让我们拭目以待。1. Bottle库安装1)使用pip安装2)下载Bottle文件https://github.com/bottlepy/bottle/blob/master/bottle.py2.“HelloWorld!”所谓万事功成先HelloWorld,从这个简单的示例中,了解Bottle的基本机制。先上代码:首先我们从b

ASGI解释:Python Web开发的未来ASGI解释:Python Web开发的未来Apr 12, 2023 pm 10:37 PM

​译者 | 李睿审校 | 孙淑娟Python Web应用程序长期以来一直遵循Web服务器网关接口(WSGI)标准,该标准描述了它们如何与Web服务器通信。WSGI最初于2003年推出,并于2010年更新,仅依赖于Python2.2版本中原生可用的、易于实现的功能。因此, WSGI迅速融入了所有主要的Python Web框架,并成为Python Web开发的基石。快进到2022年。Python2已经过时,Python现在具有处理网络调用等异步操作的原生语法。WSGI和其他默认假定同步行为的标准无法

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具