1. 客户端拥有Web服务端的class字节码文件
条件:能拿到服务端提供的接口Class,包括启用代理模式的应用
private static void initWebServiceClient() {
//Service srModel = new ObjectServiceFactory().create(TestDAOService.class);
Service serviceModel = new ObjectServiceFactory().create(IHelloService.class);
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
ResourceBundle rb = ResourceBundle.getBundle("com/sonyon/properties/config");
//String endPoint = "http://80.80.100.186:80/xfire/services/IHelloService";
String endPoint = rb.getString("service");
boolean enableProxy = Boolean.valueOf(rb.getString("enableproxy")).booleanValue();
String proxyAddress = rb.getString("proxyhost");
String proxyPort = rb.getString("proxyport");
try {
//启用代理
if(enableProxy){
service = (IHelloService) factory.create(serviceModel,endPoint);
//Client client = new Client(serviceModel,endPoint);
Client client = Client.getInstance(service);
//禁用默认代理Util类
client.setProperty(CommonsHttpMessageSender.DISABLE_PROXY_UTILS,"true");
client.setProperty(CommonsHttpMessageSender.DISABLE_KEEP_ALIVE,"true");
//禁用100-continue协议
client.setProperty(CommonsHttpMessageSender.DISABLE_EXPECT_CONTINUE,"true");
client.setProperty(CommonsHttpMessageSender.HTTP_PROXY_HOST,proxyAddress);
client.setProperty(CommonsHttpMessageSender.HTTP_PROXY_PORT,proxyPort);
//client.setProperty(HttpTransport.CHUNKING_ENABLED,"true");
} else {
//service = (IHelloService) factory.create(serviceModel,endPoint);
service = (IHelloService) factory.create(serviceModel,endPoint);
//Client client = new Client(serviceModel,endPoint);
Client client = Client.getInstance(service);
//禁用默认代理Util类
client.setProperty(CommonsHttpMessageSender.DISABLE_PROXY_UTILS,"true");
client.setProperty(CommonsHttpMessageSender.DISABLE_KEEP_ALIVE,"true");
//禁用100-continue协议
client.setProperty(CommonsHttpMessageSender.DISABLE_EXPECT_CONTINUE,"true");
//client.setProperty(HttpTransport.CHUNKING_ENABLED,"true");
}
/*URL testurl = new URL(testwsdl);
HttpURLConnection httpConnection = (HttpURLConnection)testurl.openConnection();
httpConnection.setReadTimeout(20000);//设置http连接的读超时,单位是毫秒
httpConnection.connect();
Client testClient = new Client(httpConnection.getInputStream(), null);
//Client testClient = new Client(new URL(testwsdl));
if(enableProxy){
testClient.setProperty(CommonsHttpMessageSender.DISABLE_PROXY_UTILS,"true");
testClient.setProperty(CommonsHttpMessageSender.HTTP_PROXY_HOST,"10.60.1.33");
testClient.setProperty(CommonsHttpMessageSender.HTTP_PROXY_PORT,"808");
}*/
String result = service.sayHi("test");
logger.info("WebService测试程序返回字符串为:" + result);
//Object[] results = testClient.invoke("getName",new Object[] {});
if(result != null){
logger.info("--------------WebService client Create and Test success----------------------------");
} else {
logger.warn("--------------WebService client Create success But Test failure---------------------");
}
} catch (Exception e) {
logger.warn("WebService客户端连接服务器失败,请检查WebService服务器参数或网络连接!",e);
}
}
// JSR181模式,注意这里Server端开发组需要向Client提供实现类,而不止于//接口,有点危险
Service srvcModel = new AnnotationServiceFactory().create(HelloServiceImpl.class);
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
String helloWorldURL = "http://localhost:8080/webservice/services/Hello";
Hello hello = (Hello) factory.create(srvcModel,helloWorldURL);
System.out.println(hello.sayHi("test"));
2、 动态模式,不生成字节码,直接调用
动态模式不需要服务端的class,不过性能和复杂对象映射等估计做得不会太好。
Client client = new Client(new URL("http://localhost:8080/webservice/services/Hellowsdl"));
Object[] results = client.invoke("sayHello", new Object[] { "Cao," });
System.out.println((String) results[0]);
3、 通过开发工具、根据WSDL生成Client Stub
注:来源于网络仅作参考
//简单参数的
HelloClient client=new HelloClient();
HelloPortType port =client.getHelloHttpPort();
System.out.println(port.sayHello("hi!"));
//参数复杂的
MemberServiceClient client = new MemberServiceClient();
MemberService memberService = client.getMemberServiceHttpPort();
User user = new User();
/*JAXBElement<String> name = new JAXBElement<String>(new QName(
"http://memberService", "username"), String.class, "smallnest");
JAXBElement<String> password = new JAXBElement<String>(new QName(
"http://memberService", "password"), String.class, "123456");*/
ObjectFactory objFac=new ObjectFactory();
JAXBElement<String> name = objFac.createUserUsername("smallnest");
JAXBElement<String> password = objFac.createUserPassword("123456");
user.setUsername(name);
user.setPassword(password);
Member oneMember = new Member();
JAXBElement<String> memeberName = new JAXBElement<String>(new QName(
"http://memberService", "name"), String.class, "迈克");
JAXBElement<String> email= new JAXBElement<String(newQName("http://memberService","email"), String.class,"micro@micro.com");
oneMember.setName(memeberName);
oneMember.setEmail(email);
oneMember.setRank(6);
// 调用方法
memberService.addMember(oneMember, user);
4、通过Ajax调用(js+XML)
(1、)
写一个页面,发送Ajax请求,请求的URL即服务的地址,请求方式是POST,另外,还需要设置请求头,以及手动构造请求体。
<head>
<title>通过ajax调用webservice服务</title>
<script>
var xhr;
function sendAjaxWS(){
xhr = new ActiveXObject("Microsoft.XMLHTTP");
//指定ws的请求地址
var wsUrl = "http://192.168.1.108:5678/hello";
//手动构造请求体
var requestBody = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" ' + ' xmlns:q0="http://service.itcast.cn/" xmlns:xsd="http://www.w3.org/2001/XMLSchema "'+
' xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">'+
'<soapenv:Body><q0:sayHello><arg0>'+
document.getElementById("msg").value+'</arg0> <arg1>10</arg1> </q0:sayHello></soapenv:Body></soapenv:Envelope>';
//打开连接
xhr.open("POST",wsUrl,true);
//重新设置请求头
xhr.setRequestHeader("content-type","text/xml;charset=utf8");
//设置回调函数
xhr.onreadystatechange = _back;
//发送请求
xhr.send(requestBody);
}
//定义回调函数
function _back(){
if(xhr.readyState == 4){
if(xhr.status == 200){
var ret = xhr.responseXML;
//解析xml
var eles = ret.getElementsByTagName("return")[0];
alert(eles.text);
}
}
}
</script>
</head>
<body>
<input type="text" id="msg" />
<input type="button" onclick="sendAjaxWS();" value="通过ajax调用webservice服务"/>
</body>
由于使用ajax – js调用web服务完成不同于使用java代码调用。所以,必须要对SOAP文件非常的了解。
一般使用ajax调用,应该是在已经获知了以下信息以后才去调用:
获知请求(request)的soap文本。
获知响应(response)的soap文本。
请求文件和响应文本格式,一般会随web服务的发布一同发布。
我们可以通过WSExplorer获取上面两段文本。
5、 通过URLConnection调用
1,指定WebService服务的请求地址:
String wsUrl = "http:// 124.205.244.130:5678/hello";
2,创建URL:URL url = new URL(wsUrl);
3,建立连接,并将连接强转为Http连接
URLConnection conn = url.openConnection();
HttpURLConnection con = (HttpURLConnection) conn;
4,设置请求方式和请求头:
con.setDoInput(true); //是否有入参
con.setDoOutput(true); //是否有出参
con.setRequestMethod("POST"); // 设置请求方式
con.setRequestProperty("content-type", "text/xml;charset=UTF-8");
5,// 手动构造请求体
String requestBody = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" "
+ " xmlns:q0=\"http://service.itcast.cn/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema \" "
+ " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">"
+ "<soapenv:Body><q0:sayHello><arg0>lisi</arg0> <arg1>10</arg1> </q0:sayHello></soapenv:Body></soapenv:Envelope>";
6,通过流的方式将请求体发送出去:
//获得输出流
OutputStream out = con.getOutputStream();
out.write(requestBody.getBytes());
out.close();
7,服务端返回正常:
int code = con.getResponseCode();
if(code == 200){//服务端返回正常
InputStream is = con.getInputStream();
byte[] b = new byte[1024];
StringBuffer sb = new StringBuffer();
int len = 0;
while((len = is.read(b)) != -1){
String str = new String(b,0,len,"UTF-8");
sb.append(str);
}
System.out.println(sb.toString());
is.close();
}
con.disconnect();
}
说明:整合两篇文章的特点,把client编程和交互模式做一个统一
参考:
1、http://www.cnblogs.com/yolanda-lee/p/4907380.html#3916174
2、https://blog.csdn.net/javalearning1014/article/details/2667974