Java之webService知识

Java之webService知识

1 webservice基础知识

1.1 webService请求的本质

一次webService本质请求,如下所示:

1.2 wsdl文档解析

wsdl文档元素结果,及相应关系如下:

2 JDK创建webService的方法

2.1  jdk服务端创建

2.1.1 创建一个java项目和相应的包

2.1.2 创建一个提供webservice服务的接口HelloWs,如下所示

2.1.3 创建接口的实现类HelloWsImpl,如下所示

2.1.4 创建一个java类,用于发布webservice服务

2.2  jdk客户端创建

2.2.1 创建一个客户端java工程

2.2.2 通过cmd进入到项目的src目录下,执行命令

wsimport -keep http://localhost:8090/helloWs?wsdl  如下所示

2.2.3 刷新项目,根据wsdl文档,创建客户端测试方法WsClientTest

2.2.4 执行客户端测试方法,即可获取到webservice服务端返回的数据。

3 通过wsdl文档创建客户端

3.1 远程wsdl文档创建

3.1.1 已知可用的wsdl文档为:http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl

先通过eclipse的webservice浏览器访问测试,所示如下

3.1.2 通过cmd窗口,采用

wsimport -keep http://ws.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl 生成客户端

报错如下原因:.net语言编写的webservice服务端;

解决方法:见‘3.2 本地wsdl文档创建’

3.2 本地wsdl文档创建

3.2.1 首先用浏览器解析wsdl文件,并在项目中新建一个wsdl文件,将浏览器wsdl中内容拷贝到eclipse的wsdl文件中

3.2.2 将<s:element ref="s:schema" /> <s:any />全部替换为

<s:any minOccurs="2" maxOccurs="2" />

3.2.3 在cmd中用wsimport命令生成客户端代码,

Wsimport -keep wsdl文档物理路径

这时候的wsdl路径为eclipse文件中的路径,创建的时候有些警告信息,可忽略

3.2.4 刷新项目,编写客户端代码测试

4 cxf创建webService的方法

4.1 cxf环境搭建

4.1.1 去官网下载cxf压缩文件:http://cxf.apache.org/download.html解压后,把apache-cxf-2.4.1\lib目录下的jar包引用到java项目中。添加path:D:\software\apache-cxf-3.1.8\bin信息用于生成客户端。

4.2 cxf创建服务端

4.2.1 创建一个java项目,引入必须的jar包,编写服务端(方式同“jdk服务端创建”)

4.3 cxf创建客户端

4.3.1 cmd通过命令wsdl2java http://localhost:8081/dcp/webservice/dataType?wsdl 生成客户端代码,编写客户端测试代码(方式同“jdk客户端创建”)

5 通过ajax发送请求

6 通过jquery发送请求

在传递参数的时候,需要注意的是,ajax请求的参数的名称必须和WebService中的方法的名称一致,否则调用不能成功。下面是一段WebService测试代码:

  $.ajax({  

                url: "WebService1.asmx/WS2",  

                contentType: "application/json; charset=utf-8",  

                type: "POST",  

                dataType: "json",  

                data: "{s:‘POST有参数‘}",  

                success: function(json) {  

                    alert(json.d);  

                },  

                error: function(x, e) {  

                    alert(x.responseText); ;  

                },  

                complete: function(x) {  

                    alert(x.responseText);  

                }  

            });  

7 通过HttpUrlConnection 发送请求

7.1 get方式获取

代码示例如下:

/**

 * get请求方式

 * @param mobile_number

 * @throws Exception

 */

public static String getHttpByGet(String mobile_number) throws Exception{

String address = "http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo?mobileCode="+mobile_number+"&userID=";

URL url = new URL(address);

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

// 获取从服务器返回的数据

InputStream is = conn.getInputStream();  

        byte[] buffer = new byte[1024];  

        int len = 0;  

        String result = "";  

        while( (len = is.read(buffer))!=-1 ){  

            String ss = new String(buffer,0,len,"UTF-8");  

            result += ss;  

        }  

        /* 返回的是拦截中的返回体,形式如下

          <?xml version="1.0" encoding="utf-8"?>

<string xmlns="http://WebXml.com.cn/">

18770093059:江西 南昌 江西移动全球通卡

</string>

        */

        // 关闭流

        is.close();  

        conn.disconnect();

        return result;

};

7.2 post方式获取

示例代码如下:

/**

 * post请求方式

 * @param mobile_number

 * @throws Exception

 */

public static String getHttpByPost(String mobile_number) throws Exception{

String address = "http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo";

URL url = new URL(address);

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

// 设置允许发送信息,默认为false

conn.setDoInput(true);

// 设置允许输出信息,默认为true

conn.setDoOutput(true);

// 设置发送请求方式,默认为GET

conn.setRequestMethod("POST");

/* 设置发送内容类型

 * text/xml;

 * application/soap+xml;

 * application/x-www-form-urlencoded;

 */

conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");

//构造请求体消息  

String soap = "mobileCode="+mobile_number+"&userID=";

// 构造输出流

OutputStream os = conn.getOutputStream();

// 向输出流写信息

os.write(soap.getBytes("utf-8"));

// 获取从服务器返回的数据

InputStream is = conn.getInputStream();  

        byte[] buffer = new byte[1024];  

        int len = 0;  

        String result = "";  

        while( (len = is.read(buffer))!=-1 ){  

            String ss = new String(buffer,0,len,"UTF-8");  

            result += ss;  

        }  

        /* 返回的是拦截中的返回体,形式如下

          <?xml version="1.0" encoding="utf-8"?>

         <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xmlns:xsd="http://www.w3.org/2001/XMLSchema">

         <soap:Body>

         <getMobileCodeInfoResponse xmlns="http://WebXml.com.cn/">

         <getMobileCodeInfoResult>18770093059:江西 南昌 江西移动全球通卡</getMobileCodeInfoResult>

         </getMobileCodeInfoResponse>

         </soap:Body>

         </soap:Envelope>

        */

        // 关闭流

        os.close();  

        is.close();  

        conn.disconnect();

        return result;

};

/**

 * get请求方式

 * @param mobile_number

 * @throws Exception

 */

public static String getHttpByGet(String mobile_number) throws Exception{

String address = "http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo?mobileCode="

+mobile_number+"&userID=";

URL url = new URL(address);

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

// 获取从服务器返回的数据

InputStream is = conn.getInputStream();  

        byte[] buffer = new byte[1024];  

        int len = 0;  

        String result = "";  

        while( (len = is.read(buffer))!=-1 ){  

            String ss = new String(buffer,0,len,"UTF-8");  

            result += ss;  

        }  

        /* 返回的是拦截中的返回体,形式如下

          <?xml version="1.0" encoding="utf-8"?>

<string xmlns="http://WebXml.com.cn/">18770093059:江西 南昌 江西移动全球通卡</string>

        */

        // 关闭流

        is.close();  

        conn.disconnect();

        return result;

};

7.3 soap方式获取

示例代码如下:

/**

 * soap1.2 请求方式

 * @param mobile_number

 * @throws Exception

 */

public static String getHttpBySoap(String mobile_number) throws Exception{

String address = "http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx";

URL url = new URL(address);

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

// 设置允许发送信息,默认为false

conn.setDoInput(true);

// 设置允许输出信息,默认为true

conn.setDoOutput(true);

// 设置发送请求方式,默认为GET

conn.setRequestMethod("POST");

/* 设置发送内容类型

 * text/xml;

 * application/soap+xml;

 */

conn.setRequestProperty("Content-Type", "application/soap+xml;charset=UTF-8");

//构造请求体消息  

String soap = "<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "

+ "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" "

+ "xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">"

+ "<soap12:Body>"

+ " <getMobileCodeInfo xmlns=\"http://WebXml.com.cn/\">"

+ " <mobileCode>"+mobile_number+"</mobileCode>"

+ " <userID></userID>"

+ " </getMobileCodeInfo>"

+ "</soap12:Body>"

+ "</soap12:Envelope>";

// 构造输出流

OutputStream os = conn.getOutputStream();

// 向输出流写信息

os.write(soap.getBytes("utf-8"));

// 获取从服务器返回的数据

InputStream is = conn.getInputStream();  

        byte[] buffer = new byte[1024];  

        int len = 0;  

        String result = "";  

        while( (len = is.read(buffer))!=-1 ){  

            String ss = new String(buffer,0,len,"UTF-8");  

            result += ss;  

        }  

        /* 返回的是拦截中的返回体,形式如下

          <?xml version="1.0" encoding="utf-8"?>

         <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"

         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xmlns:xsd="http://www.w3.org/2001/XMLSchema">

         <soap:Body>

         <getMobileCodeInfoResponse xmlns="http://WebXml.com.cn/">

         <getMobileCodeInfoResult>18770093059:江西 南昌 江西移动全球通卡</getMobileCodeInfoResult>

         </getMobileCodeInfoResponse>

         </soap:Body>

         </soap:Envelope>

        */

        // 关闭流

        os.close();  

        is.close();  

        conn.disconnect();

        return result;

};

7.4 解析xml格式字符串方式

采用jdom解析,需下载jaxen-1.1-beta-9.jar、jdom-1.0.jar

/**

 * 解析xml格式的字符串,获取需要的内容

 * @param info

 * @return

 */

public static String parseXml(String info) {

StringReader read = new StringReader(info.toString());

InputSource source = new InputSource(read);

SAXBuilder sax = new SAXBuilder();

Document doc = null;

try {

doc = sax.build(source);

Element root = doc.getRootElement();

return root.getValue();

} catch (JDOMException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

return info;

}

8 通过xfire创建webService的方法

8.1 服务端创建

8.1.1 创建webservice接口和webservice接口实现类,引入相应jar包

8.1.2 配置web.xml文件,增加如下配置信息

<!--  提供webservice 服务 -->

<servlet>  

 <servlet-name>xfire</servlet-name>

 <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>                                                                  

 </servlet>  

 <servlet-mapping>  

     <servlet-name>xfire</servlet-name>  

     <url-pattern>/webservice/*</url-pattern>  

 </servlet-mapping>

8.1.3 配置/XX/src/META-INF/xfire/services.xml文件

<?xml version="1.0" encoding="UTF-8"?>

<beans>

<service xmlns="http://xfire.codehaus.org/config/1.0">

<name>DcpWebService</name>

<!-- <namespace>http://localhost:80/dcp/webservice/DcpWebService</namespace> -->

<serviceClass>com.neusoft.education.dcp.webservice.DcpWebService</serviceClass>

<implementationClass>com.neusoft.education.dcp.webservice.DcpWebServiceImpl</implementationClass>

<!--

<inHandlers>

<handler handlerClass="com.neusoft.education.dcp.webservice.AuthenticationHandler"></handler>

</inHandlers>

 -->

</service>

</beans>

8.1.4 随着服务器启动自动发布webservice服务。

8.2 客户端创建

说明:使用xfire调用webservice主要应对返回类型为字符串或json格式。

8.2.1 方式一:使用xfire API Client类的invoke方法调用,需引入xfire-all-1.2.6.jar、XmlSchema.jar等相应jar包

示例代码如下:

Client client = new Client(new URL(  

                "http://localhost:9999/WebServiceProject/services/IMyService?wsdl"));  

  Object[] results = client.invoke("example", new Object[] { "hello world" });  

  System.out.println(results[0]);

8.2.2 方式二:使用服务端接口方式调用

Service srvcModel = new   ObjectServiceFactory().create(IIMyService.class);    

XFireProxyFactory factory =     

new XFireProxyFactory(XFireFactory.newInstance().getXFire());    

String helloWorldURL = "http://localhost:9999/WebServiceProject/services/MyService";    

try {    

IIMyService srvc = (IIMyService)factory.create( srvcModel, helloWorldURL);    

String result = srvc.example("hello world");    

System.out.print(result);    

} catch (MalformedURLException e) {    

e.printStackTrace();    

}  

9 通过axis 创建webService的方法

9.1 axis 服务端创建

9.1.1 创建一个web工程,引入相应jar包放入lib下

9.1.2 web.xml中增加axis配置信息,示例如下:

9.1.3 创建一个server-config.wsdd放在WEB-INF/server-config.wsdd下,内容示例如下

9.1.4 根据配置,创建相应的webservice接口和接口实现类,不需要任何注解

9.1.5 配置tomcat服务器,启动服务器,可以访问wsdl文档,代表服务端创建成功

http://localhost:8080/ws_axis_server/services/helloWs?wsdl

9.2 axis客户端创建

9.2.1 创建项目,加入相应的jar包,编写测试类,具体示例如下:

package com.neusoft.education.test;

import java.net.URL;

import javax.xml.rpc.ParameterMode;

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

import org.apache.axis.encoding.XMLType;

/**

 * Axis 方法调用webservice服务端

 */

public class AxisClientTest {

public static void main(String[] args) throws Exception {

sayHelloTest("Cat");

sayHelloTest("Tom");

}

public static String getSortTest(){

// 1.创建一个axis service

Service service = new Service();

// 2.创建url对象

        String wsdlUrl = "http://oa.ecjtu.jx.cn/domcfg.nsf/OAInfo?WSDL";

        URL url = null;

        String res = "";

try {

//通过URL类的构造方法传入wsdlUrl地址创建URL

url = new URL(wsdlUrl);

Call call = (Call) service.createCall();

call.setTargetEndpointAddress(url);//给call对象设置请求的URL属性

call.setOperationName("GETSORT");//给call对象设置调用方法名属性

call.addParameter("LOGINID", XMLType.SOAP_STRING, ParameterMode.IN);// 给call对象设置方法的参数名、参数类型、参数模式

call.addParameter("LOGINPASS", XMLType.SOAP_STRING, ParameterMode.IN);// 给call对象设置方法的参数名、参数类型、参数模式

call.addParameter("DBKEY", XMLType.SOAP_STRING, ParameterMode.IN);// 给call对象设置方法的参数名、参数类型、参数模式

call.setReturnType(XMLType.XSD_ANYTYPE);// 设置调用方法的返回值类型

// 4.通过invoke方法调用webservice

res = (String) call.invoke(new Object[] {"Portal","Portal","XXWJ"});//调用服务方法

} catch (Exception e) {

e.printStackTrace();

}

        // 3.创建服务方法的调用者对象call,设置call对象的属性

return res;

}}

10 常见webservice调用错误

10.1 服务器未能识别 HTTP 头 SOAPAction 的值

10.1.1 使用java调用.net的WebService,通过“8.2.2 方式二:使用服务端接口方式调用”如果报错,则在.NET 的 WebService 类(即 .asmx 文件下的类)添加属性 [SoapDocumentService(RoutingStyle=SoapServiceRoutingStyle.RequestElement)],可行的通。

时间: 2024-11-07 13:12:39

Java之webService知识的相关文章

java创建webservice client

java的webservice实现有多种方式,可用的工具也有一些.之前对这块的只是比较缺乏,以至于一上来就一直看spring webservice.花费了几天后发现和要用的功能不符,就··· 当前学习的需求是webservice client.因此整篇文章用来说明java webserviceclient的创建过程. 首先使用java自带的soapconnection实现.那首先具体的client访问流程为 SOAPConnection connection = null; try { SOAP

Java调用WebService 接口 实例

这里给大家介绍一下,Java调用webservice的一个实例的过程. 本项目不能运行,因为接口地址不可用. 这里只是给大家介绍一个过程,同时留作自己的笔记.如果要学习,可以参照别人的实例.比较好. ①选择项目根目录的src ,右键,new --> webservice client 然后输入地址: http://172.18.100.52:456/hello?wsdl 必须要加wsdl结尾,这样才是一个webservice的接口. finlish.这时候刷新项目.可以看到项目下/src/com

关于java的JIT知识

1.JIT的工作原理图 工作原理 当JIT编译启用时(默认是启用的),JVM读入.class文件解释后,将其发给JIT编译器.JIT编译器将字节码编译成本机机器代码. 通常javac将程序源码编译,转换成java字节码,JVM通过解释字节码将其翻译成相应的机器指令,逐条读入,逐条解释翻译.非常显然,经过解释运行,其运行速度必定会比可运行的二进制字节码程序慢.为了提高运行速度,引入了JIT技术. 在执行时JIT会把翻译过的机器码保存起来,已备下次使用,因此从理论上来说,採用该JIT技术能够,能够接

java实现WebService 以及客户端不同的调用方式

java 实现WebService 以及不同的调用方式 webservice:    就是应用程序之间跨语言的调用    wwww.webxml.com.cn    1.xml    2.    wsdl: webservice description language web服务描述语言        通过xml格式说明调用的地址方法如何调用,可以看错webservice的说明书        3.soap simple object access protoacl (简单对象访问协议)   

Java创建WebService服务及客户端实现(转)

简介 WebService是一种服务的提供方式,通过WebService,不同应用间相互间调用变的很方便,网络上有很多常用的WebService服务,如:http://developer.51cto.com/art/200908/147125.htm,不同的语言平台对WebService都有实现,Java的WebService实现,比较流行的有Axis2.Jaxws,本文介绍的是Axis2. Axis2下载和部署 Axis2是Apache开发的一个开源项目,再次感叹Apache的伟大! 下载地址

Java调用WebService

Java调用WebService可以直接使用Apache提供的axis.jar自己编写代码,或者利用Eclipse自动生成WebService Client代码,利用其中的Proxy类进行调用.理论上是一样的,只不过用Eclipse自动生成代码省事些. 1.编写代码方式: package com.yudun.test; import java.rmi.RemoteException;import org.apache.axis.client.Call;import org.apache.axis

delphi调用 java 的 WebService服务端.

// InvRegistry.RegisterInvokeOptions(TypeInfo(ModelADServicePortType), ioLiteral); InvRegistry.RegisterInvokeOptions(TypeInfo(ModelADServicePortType), ioDocument); delphi调用 java 的 WebService服务端.,布布扣,bubuko.com

纯 Java 开发 WebService 调用测试工具(wsCaller.jar)

注:本文来自hacpai.com:Tanken的<纯 Java 开发 WebService 调用测试工具(wsCaller.jar)>的文章 基于 Java 开发的 WebService 测试工具,不像上文的 iWallpaper.jar 只能实现在 Windows 系统下的功能,此工具发挥了 Java 跨平台的优势,亲测可在 Windows.Mac OS 及 Linux 下运行及使用.简单易用的专门用于测试 WebService 的小工具,在 2003 版 wsCaller.jar 的基础上

java的WebService实践(cxf)

Java发布WebService,结合Spring,通过cxf的方式 难点:1.引用什么jar包: 1.创建接口 源码如下: package com.nankang; import javax.jws.WebParam; import javax.jws.WebService; @WebService public interface HelloWorld { String sayHi(@WebParam(name="text") String text); } 2.实现接口 源码如下