【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小时内删除。
发表评论