转自:https://blog.youkuaiyun.com/sunroyi666/article/details/51917991
一. WSDL WebService的创建:
1.创建【Web Service Project】:
WebServices Framework要选JAX-WS:
2.写一个简单的测试用例:
-
package com.webservice;
-
public class WebService{
-
public String printData(String printerName){
-
String strRet = "Welcome to use WebService, " + printerName;
-
System.out.println("Print from WebService:" + strRet);
-
return strRet;
-
}
-
}
3.发布Web Service:
点击工具栏的New Web Service:
Strategy选择第二个(Create web service from Java class):
勾选【Generate WSDL in project】:
点击【Finish】后,系统会在WEB-INF/wsdl下生成两个文件:
WebServiceService.wsdl:这个文件是用来描述Web Service内容的
-
<?xml version="1.0" encoding="UTF-8"?>
-
<!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.3-hudson-390-. -->
-
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://webservice.com/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="WebServiceService" targetNamespace="http://webservice.com/">
-
<types>
-
<xsd:schema>
-
<xsd:import namespace="http://webservice.com/" schemaLocation="WebServiceService_schema1.xsd"/>
-
</xsd:schema>
-
</types>
-
<message name="printData">
-
<part element="tns:printData" name="parameters"/>
-
</message>
-
<message name="printDataResponse">
-
<part element="tns:printDataResponse" name="parameters"/>
-
</message>
-
<portType name="WebServiceDelegate">
-
<operation name="printData">
-
<input message="tns:printData"/>
-
<output message="tns:printDataResponse"/>
-
</operation>
-
</portType>
-
<binding name="WebServicePortBinding" type="tns:WebServiceDelegate">
-
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
-
<operation name="printData">
-
<soap:operation soapAction=""/>
-
<input>
-
<soap:body use="literal"/>
-
</input>
-
<output>
-
<soap:body use="literal"/>
-
</output>
-
</operation>
-
</binding>
-
<service name="WebServiceService">
-
<port binding="tns:WebServicePortBinding" name="WebServicePort">
-
<soap:address location="http://localhost:8080/WebService/WebServicePort"/>
-
</port>
-
</service>
-
</definitions>
WebServiceService_schema1.xsd:用来说明Web Service的命令及其参数
比如:sample里面的WebService是【printData】,有一个String类型的参数【arg0】,返回值一个String类型的值。
-
<?xml version="1.0" encoding="UTF-8"?>
-
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://webservice.com/" targetNamespace="http://webservice.com/" version="1.0">
-
<xs:element name="printData" type="tns:printData"/>
-
<xs:element name="printDataResponse" type="tns:printDataResponse"/>
-
<xs:complexType name="printData">
-
<xs:sequence>
-
<xs:element minOccurs="0" name="arg0" type="xs:string"/>
-
</xs:sequence>
-
</xs:complexType>
-
<xs:complexType name="printDataResponse">
-
<xs:sequence>
-
<xs:element minOccurs="0" name="return" type="xs:string"/>
-
</xs:sequence>
-
</xs:complexType>
-
</xs:schema>
将WebService项目部署到Tomcat即可。
(部署方法略)
二. WSDL WebService的调用:
方法1:创建Web Service Client来调用:
1.创建【Java Project】:
2.点击工具栏的New Web Service Client:
3.选择【WSDL URL】:
4.点击【Next】完成创建后,在src/com/webservice下,自动生成相关文件。(WebServiceTest.java除外,这个是自己创建的调用文件)
5.创建【WebServiceTest.java】
代码如下:
-
package com.webservice;
-
public class WebServiceTest{
-
public static void main(String[] args){
-
WebServiceService wssPrintData = new WebServiceService();
-
WebServiceDelegate wsdPrintData = wssPrintData.getWebServicePort();
-
System.out.println(wsdPrintData.printData("sun"));
-
}
-
}
6.【WebServiceTest.java】右键→Run As→Java Application
输出结果:
Welcome to use WebService, sun
方法2:用HttpClient调用:
-
package com.httpclientforwsdl;
-
import java.io.ByteArrayInputStream;
-
import java.io.InputStream;
-
import java.util.HashMap;
-
import java.util.Iterator;
-
import java.util.Map;
-
import org.apache.commons.httpclient.HttpClient;
-
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
-
import org.apache.commons.httpclient.methods.PostMethod;
-
import org.apache.commons.httpclient.methods.RequestEntity;
-
public class WebServiceHttpClientTest{
-
public synchronized static String accessService(String wsdl,String ns,String method,Map<String,String> params,String result)throws Exception{
-
//拼接参数
-
String param = getParam(params);
-
String soapResponseData = "";
-
//拼接SOAP
-
StringBuffer soapRequestData = new StringBuffer("");
-
soapRequestData.append("<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">");
-
soapRequestData.append("<soap:Body>");
-
soapRequestData.append("<ns1:"+method+" xmlns:ns1=\""+ns+"\">");
-
soapRequestData.append(param);
-
soapRequestData.append("</ns1:"+method+">");
-
soapRequestData.append("</soap:Body>" + "</soap:Envelope>");
-
PostMethod postMethod = new PostMethod(wsdl);
-
// 然后把Soap请求数据添加到PostMethod中
-
byte[] b=null;
-
InputStream is=null;
-
try {
-
b = soapRequestData.toString().getBytes("utf-8");
-
is = new ByteArrayInputStream(b, 0, b.length);
-
RequestEntity re = new InputStreamRequestEntity(is, b.length,"text/xml; charset=UTF-8");
-
postMethod.setRequestEntity(re);
-
HttpClient httpClient = new HttpClient();
-
int status = httpClient.executeMethod(postMethod);
-
System.out.println("status:"+status);
-
if(status==200){
-
soapResponseData = getMesage(postMethod.getResponseBodyAsString(),result);
-
}
-
} catch (Exception e) {
-
e.printStackTrace();
-
} finally{
-
if(is!=null){
-
is.close();
-
}
-
}
-
return soapResponseData;
-
}
-
public static String getParam(Map<String,String> params){
-
String param = "";
-
if(params!=null){
-
Iterator<String> it = params.keySet().iterator();
-
while(it.hasNext()){
-
String str = it.next();
-
param+="<"+str+">";
-
param+=params.get(str);
-
param+="</"+str+">";
-
}
-
}
-
return param;
-
}
-
public static String getMesage(String soapAttachment,String result){
-
System.out.println("message:"+soapAttachment);
-
if(result==null){
-
return null;
-
}
-
if(soapAttachment!=null && soapAttachment.length()>0){
-
int begin = soapAttachment.indexOf(result);
-
begin = soapAttachment.indexOf(">", begin);
-
int end = soapAttachment.indexOf("</"+result+">");
-
String str = soapAttachment.substring(begin+1, end);
-
str = str.replaceAll("<", "<");
-
str = str.replaceAll(">", ">");
-
return str;
-
}else{
-
return "";
-
}
-
}
-
/**
-
* @param args
-
*/
-
public static void main(String[] args) {
-
try {
-
Map<String,String> param = new HashMap<String,String>();
-
param.put("arg0", "sun");
-
String wsdl="http://localhost:8080/WebService/WebServicePort?wsdl";
-
String ns = "http://webservice.com/";
-
String method="printData";
-
String response =accessService(wsdl,ns,method,param,"return");
-
System.out.println("main:"+response);
-
} catch (Exception e) {
-
e.printStackTrace();
-
}
-
}
-
}
显示结果:
-
status:200
-
七月 15, 2016 3:43:27 下午 org.apache.commons.httpclient.HttpMethodBase getResponseBody
-
警告: Going to buffer response body of large or unknown size. Using getResponseBodyAsStream instead is recommended.
-
message:<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:printDataResponse xmlns:ns2="http://webservice.com/"><return>Welcome to use WebService, sun</return></ns2:printDataResponse></S:Body></S:Envelope>
-
main:Welcome to use WebService, sun