Web service是一個平臺獨立的跨語言、跨平臺,低耦合的,自包含的、基於SOAP(simple object access protocal)協議的可編程的web的應用程序,可遠程接口訪問。可使用開放的XML(標準通用標記語言下的一個子集)標準來描述、發佈、發現、協調和配置這些應用程序,用於開發分佈式的互操作的應用程序。
####1、WebService術語
再寫helloworld之前,我們先來介紹一下webService裏面的術語:
1) WSDL
網絡服務描述語言是Web Service的描述語言,它包含一系列描述某個web service的定義。後面我們會根據helloworld來分析它的結構層次,來了解webService的實現原理。
2) SOAP
SOAP(simple object access protocal),簡單對象訪問協議是交換數據的一種協議規範,是一種輕量的、簡單的、基於XML(標準通用標記語言下的一個子集)的協議,它被設計成在WEB上交換結構化的和固化的信息。
3) SEI
SEI(webservice endpoint interface),服務端口接口。基於SOAP的Java Web服務儘管可以只由單獨的Java類來實現,但是遵從最佳實踐原則,首先應該定義一個Java接口類,在此接口內聲明Web服務需要完成或實現的業務方法。通常這類接口被稱爲"SEI",即服務端點接口(Service Endpoint Interface)。
我們先來基於JDK的實現一個Webserivce的Helloworld,然後再來分析一下,Webservice的實現原理。
####2、創建Webservice-service項目
1) 項目結構
2) UserService.Java
@WebService
public interface UserService {
void sayHi(String username);
}
3) UserServiceImpl.Java
@WebService
public class UserServiceImpl implements UserService {
@WebMethod
public void sayHi(String username) {
System.out.println("hi, " + username);
}
}
4) Publish.Java
public class Publish {
public static void main(String[] args) {
String url = "http://localhost:8080/demo/hello";
Endpoint.publish(url, new UserServiceImpl());
System.out.println("webservice publish service success...");
}
}
5) 發佈服務
啓動publish.Java文件。然後進入http://:8080/demo/hello?wsdl
就會出現以下畫面:
這個webservice遠程客戶端調用服務的基礎。如果你也能訪問那麼說明你的服務發佈成功了,我們後面再來分析這個xml文件。
####3、創建Webservice-client項目
1) 創建Webservice-client項目
使用maven創建webservice-client空項目,然後進入${webservice-client}/src/main/java.打開命令窗口,輸入wsimport -keep http://localhost:8080/demo/hello?wsdl
就會生成客戶端調用代碼
調用。生成的項目結構圖如下:
2) 調用遠程服務
添加test類UserServiceTest.Java進行遠程服務調用測試
public class UserServiceTest {
public static void main(String[] args) {
UserServiceImplService userService = new UserServiceImplService();
String hiWord = userService.getUserServiceImplPort().sayHi("carl");
System.out.println(hiWord);
}
}
運行結果如下:
####4、分析WSDL
頂級元素爲definitions元素,表示這個是webservice的描述語言,然後裏面有以下幾種子元素:
#####1、types
Type(消息類型):數據類型定義的容器,它使用某種類型系統(如 XSD).首先我們來看一下types元素
然後我們再打開schemaLocation裏面的地址:
我們可以看到在type元素中定義了遠程服務暴露接口中
- 調用方法所需參數
- 調用方法的返回值類型
#####2、message
message:通信數據的抽象類型化定義,它由一個或者多個 part 組成.
我們可以看到message元素中持有調用方法請求參數與返回值類型的引用。
#####3、portType
Port Type(端口類型):特定端口類型的具體協議和數據格式規範。
#####4、binding
**Binding:**特定端口類型的具體協議和數據格式規範。
#####5、service
Service:相關端口的集合,包括其關聯的接口、操作、消息等
####5、請求流程
其實熟悉Spring IOC的朋友可以看出來,這個和Spring的bean配置是不是很類型。Webservice的調用調用就是操作暴露服務的Service的Service這個容器。然後再調用服務的port.就可以獲取到遠程服務,這樣就進行遠程調用了。
請求的消息格式類型於:
<soap:…..>
<sayHello>
<arg0>carl</arg0>
</sayHello>
</soap>
然後返回的消息體類型於:
<sayHelloResponse>
<return>hi, carl</return>
</sayHelloResponse>
這就是webservice的請求的整個過程了,現在清晰了嗎?