【JavaEE学习80下】【调⽤WebService服务的四种⽅式】
【WebService。。。
不考虑第三⽅框架,如果只使⽤JDK提供的API,那么可以使⽤三种⽅式调⽤WebService服务;另外还可以使⽤Ajax调⽤WebService 服务。
预备⼯作:开启WebService服务,使⽤jdk命令wsimport⽣成调⽤源代码
package com.kdyzm.ws;
import javax.jws.WebService;
l.ws.Endpoint;
@WebService
public class MyWsServer {
public String calculate(int input){
System.out.println("接收到请求数据:"+input);
return input*input+"";
}
public static void main(String[] args) {
Endpoint.publish("localhost:9090/ws", new MyWsServer());
System.out.println("server ready ......");
}
}
  ⽣成源代码命令:
wsimport -s . localhost:9090/ws?wsdl
  可能出现的问题参考:
  因为出现了上述问题,所以本次测试环境使⽤jdk 1.7。
⽅法⼀:使⽤最简单、效率最⾼的⽅法调⽤WebService服务
  将⽣成的java⽂件包括⽂件夹直接导⼊项⽬,并使⽤其提供的API。
1package com.hod;
调用webservice服务2
3import com.kdyzm.ws.MyWsServer;
4import com.kdyzm.ws.MyWsServerService;
5
6/**
7 * 第⼀种⽅式就是使⽤wsimport命令获取所有的需要调⽤的代码,并直接使⽤这些代码完成任务
8 * @author kdyzm
9 *
10*/
11public class Method1 {
12public static void main(String[] args) {
13        MyWsServerService myWsServerService=new MyWsServerService();
14        MyWsServer MyWsServerPort();
15        String result=myWsServer.calculate(2);
16        System.out.println(result);
17    }
18 }
  客户端控制台打印结果:4
  服务端控制台打印结果:
  这种⽅式是使⽤最多的⽅式,也是最不容易出错、效率最⾼的⽅式,推荐使⽤这种⽅式。
⽅法⼆:使⽤URLConnection调⽤WebService服务
  URLConnection是JDK最底层的类,所有的⽹络服务底层都要使⽤到该类,现在尝试直接使⽤该类操作调⽤WebService服务的过程,但是⾸先需要获取SOAL格式的请求体,可以使⽤之前介绍的Web Service Explorer浏览器捕获请求体,并将该请求体进⾏处理转换成字符串的格式(对"进⾏转义\")。
  使⽤这种⽅法不依赖于任何服务端提供的类和接⼝,只需要知道SOAP请求体的内容即可。
  SOAL请求体:
<soapenv:Envelope xmlns:soapenv="/soap/envelope/"
xmlns:q0="ws.kdyzm/" xmlns:xsd="/2001/XMLSchema"
xmlns:xsi="/2001/XMLSchema-instance">
<soapenv:Body>
<q0:calculate>
<arg0>2</arg0>
</q0:calculate>
</soapenv:Body>
</soapenv:Envelope>
  转换成String字符串:
1 String requestMessage = "<soapenv:Envelope xmlns:soapenv=\"/soap/envelope/\" "
2                + "xmlns:q0=\"ws.kdyzm/\" xmlns:xsd=\"/2001/XMLSchema\" "
3                + "xmlns:xsi=\"/2001/XMLSchema-instance\">" + "<soapenv:Body>" + "    <q0:calculate>"
4                + "        <arg0>2</arg0>" + "    </q0:calculate>" + "</soapenv:Body>" + "</soapenv:Envelope>";
  测试代码:
1package com.hod;
2
3import java.io.BufferedReader;
4import java.io.InputStream;
5import java.io.InputStreamReader;
6import java.io.OutputStream;
7import java.io.PrintWriter;
8import java.HttpURLConnection;
9import java.URL;
10
11/**
12 * 第⼆种⽅式是使⽤UrlConnecction调⽤WebService服务。
13*/
14public class Method2 {
15public static void main(String[] args) throws Exception {
16// 服务的地址
17        URL url = new URL("localhost:9090/ws");
18
19        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
20        connection.setDoInput(true);
21        connection.setDoOutput(true);
22
23        connection.setRequestMethod("POST");
24        connection.setRequestProperty("Content-Type", "text/xml;charset=utf-8");
25        OutputStream os = OutputStream();
26        PrintWriter pw = new PrintWriter(os, true);
27        String requestMessage = "<soapenv:Envelope xmlns:soapenv=\"/soap/envelope/\" "
28                + "xmlns:q0=\"ws.kdyzm/\" xmlns:xsd=\"/2001/XMLSchema\" "
29                + "xmlns:xsi=\"/2001/XMLSchema-instance\">" + "<soapenv:Body>" + "    <q0:calculate>"
30                + "        <arg0>2</arg0>" + "    </q0:calculate>" + "</soapenv:Body>" + "</soapenv:Envelope>";
31// 发起请求
32        pw.println(requestMessage);
33
34        InputStream is = InputStream();
35        BufferedReader br = new BufferedReader(new InputStreamReader(is));
36        String temp = null;
37
38        System.out.println("响应结果是:");
39while ((temp = br.readLine()) != null) {
40            System.out.println(temp);
41        }
42        pw.close();
43        os.close();
44        br.close();
45        is.close();
46    }
47 }
  结果和⽅法⼀种的结果相同。
⽅法三:使⽤JDK提供的WebService相关API实现对WebService 的服务调⽤
  使⽤这种⽅法只需要⼀个接⼝:MyWsServer就可以了,该接⼝也是通过wsimport命令获取的,它和服务端对应的服务类同名。
1package com.hod;
2
3import java.URL;
4
l.namespace.QName;
l.ws.Service;
7
8import com.kdyzm.ws.MyWsServer;
9
10/**
11 * 第三种⽅式:通过客户端编程实现Serice的远程调⽤
12 * 使⽤这种⽅式只需要知道⼀个MyWsServer接⼝就可以了。
13 * @author kdyzm
14 *
15*/
16public class Method3 {
17public static void main(String[] args) throws Exception {
18        URL url = new URL("localhost:9090/ws?wsdl");
19        Service ate(url, new QName("ws.kdyzm/", "MyWsServerService"));
20        MyWsServer Port(new QName("ws.kdyzm/", "MyWsServerPort"),MyWsServer.class);
21        String result=myWsServer.calculate(2);
22        System.out.println(result);
23    }
24 }
  服务端和客户端的控制台打印结果同上。
⽅法四:使⽤Ajax调⽤WebService服务
  这⾥使⽤原⽣的js来操作该过程:
1<!DOCTYPE html>
2<html>
3<head>
4<meta charset="UTF-8">
5<title>Insert title here</title>
6<script type="text/javascript">
7function ajaxFunction() {
8var xmlHttp;
9try {
10// Firefox, Opera 8.0+, Safari
11            xmlHttp = new XMLHttpRequest();
12        } catch (e) {
13// Internet Explorer
14try {
15                xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
16            } catch (e) {
17
18try {
19                    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
20                } catch (e) {
21                    alert("您的浏览器不⽀持AJAX!");
22                }
23            }
24        }
25return xmlHttp;
26    }
27</script>
28</head>
29<body>
30<div id="content"></div>
31<!-- 第四种⽅式:使⽤ajax的⽅式请求调⽤WebService服务 -->
32<script type="text/javascript">
33var xmlHttp = ajaxFunction();
34var wsUrl = "localhost:9090/ws";
35var requestMessage = "<soapenv:Envelope xmlns:soapenv=\"/soap/envelope/\" "
36            + "xmlns:q0=\"ws.kdyzm/\" xmlns:xsd=\"/2001/XMLSchema\" "
37            + "xmlns:xsi=\"/2001/XMLSchema-instance\">"
38                + "<soapenv:Body>"
39                + "    <q0:calculate>"
40                + "        <arg0>2</arg0>"
41                + "    </q0:calculate>"
42                + "</soapenv:Body>"
43                + "</soapenv:Envelope>";
44        xmlHttp.open("POST", wsUrl, true);
45        xmlHttp.setRequestHeader("Content-Type", "text/xml;charset=utf-8");
46        adystatechange = _callback;
47        xmlHttp.send(requestMessage);
48function _callback() {
49if (adyState == 4) {
50if (xmlHttp.status == 200) {
51var retXml = sponseXML;
52var result = ElementsByTagName("return")[0];
53                    ElementById("content").innerHTML = deValue;;
54                }
55            }
56        }
57</script>
58</body>
59</html>
  注意,result对象是[Object Element]类型的,需要调⽤.deValue⽅法获取⽂本值。
  使⽤这种⽅式只适合在IE浏览器中使⽤,使⽤⾕歌浏览器或者⽕狐浏览器都失败了,出现的异常情况: xmlHttp.open("POST", wsUrl, true);这句代码设置了请求⽅式是POST,但是实际上没管⽤,请求⽅式变成了OPTION,statckOverFlow上有⼈解释先使⽤OPTION 的请求⽅式测试和服务器的连通性,然后才使⽤POST⽅式发送请求数据,所以服务器才会报出:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。