基於SOAP協議和REST協議的郵件發送服務

1.SOA(面向服務的架構)架構模式現在十分的流行。WebService是SOA的一種實現方式,本文將用發送郵件這個服務來展示一下WebService是如何工作的。

2.WebService就是提供服務的網絡API,它給你提供服務的結構,調用方只需要負責調用服務即可。這裏其實就涉及到了一些問題,首先是如何調用?服務肯定是運行在服務器上的,要想遠程調用服務器上的服務就需要和服務器通信,和服務器通信就需要通信協議,比如大名鼎鼎的TCP協議。以及封裝了它的上層HTTP協議等等。SOAP協議和REST協議就是兩種在實現WebService的通信協議,有了這個協議,服務器會把自己的提供的服務的配置信息寫到這個協議裏,客戶端的調用解析這個協議然後調用即可。

3.首先是SOAP協議。這個協議看上去有點複雜:首先給出整個Demo的項目結構:

                                              

這裏服務和客戶端寫在了一起,無所謂了,反正知識Demo,客服端和服務器的分離也是分分種的事情,懶得每次都要切屏了。

首先,是提供服務的類:mailService.這個類提供了發送郵件的服務:

                                             

具體看一下實現:

                         

比如sendEmail這個函數,傳入地址和內容,然後調用郵件發送工具的發送函數,發送郵件。注意這裏的格式,首先是@WebService這個註解,表明這裏的類是即將被髮布成WebService類,類中要提供服務的函數,需要註解爲@WebMethod。

其他三個函數類似。(啥,郵箱工具的發送函數是怎麼寫的?,後邊會統一發出來,這個不是重點,服務的實現方式並不是重點,重點是我們怎麼實現服務的發佈和調用)。

然後服務寫好了之後,很重要,怎麼發佈?

import javax.jws.WebService;
import javax.xml.ws.Endpoint;
@WebService
public class PublishServer {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String url="http://localhost:9090/Service/mailService";
		Endpoint.publish(url,new mailService());
		System.out.print("public Success");
	}
}

調用Endpoint的發佈函數,把服務發送到固定的端口。當然了,這裏可以直接啓動Tomcat,把服務丟進Tomcat內,Tomcat啓動的時候就會自動的把服務給發佈了。

    發佈完成以後,服務端會有一個.WSDL的文件。叫做WebService描述文檔,這個就是基於SOAP協議的文檔,怎麼看這個文檔呢?啓動服務(我這裏直接啓動主函數就行,如果是在Tomcat內,就啓動tomcat),然後到發佈的端口上去看:

注意看一下地址欄的網址,就是服務所在的地址+?WSDL,意思就是請求WSDL,這是一個基於get方法的請求方法,不多說了。可以看到這個WSDL文檔,這是WebService的核心。這個文檔內描述了這個服務的所有信息,客戶端正是由於知道了這些信息才能正確的實現調用。

      那麼客戶端如何調用呢?首先需要生成客戶端,生成客戶端其實就是在解析這個WSDL文檔,根據這個文檔在客戶端建立服務端服務的視圖,通過這個視圖來調用。解析WSDL文檔有很多種方式,這裏提供一個簡單的,打開cmd輸入:

 wsimport -s D:\DataBase\AWSTestEclipse\WebServiceProject\src -p mailClient -keep http://localhost:9090/Service/mailService?wsdl

解釋一下,-s後的就是這個項目src所在的文件夾,-p後是目標代碼生成的包名,-keep就是WSDL文檔的地址,然後刷新一下文件目錄結構。

                                     

就生成了這些東西。這是怎麼實現的?其實是JDK裏面有一個專門解析WSDL文檔的JAR包。具體叫啥好像就是wsiport.jar.有了這個,就可以盡情的調用了。

      客戶端的調用我寫了兩種方式,由於懶只介紹一種吧。採用JSP+Servlet的調用。JSP前端傳回信息,後端接受信息調用服務。

                     

核心代碼:由於在客戶端我們有了服務器的視圖,就相當於把服務端的代碼給重現了,然後直接new對應的類,調用對應的方法提供服務。完事了,好像很簡單。其實這裏的底層實現我想了一下,大膽猜測,就是JAVA的RMI,簡直和遠程方法調用一摸一樣。所以軟件的發展好像就是再不斷重複?????

     然後SOAP就說完了。然後是REST。

     REST可能就是JAVA註解的應用吧(啥叫註解???隨便理解一下就是注入並解釋,JAVA的動態注入大名鼎鼎,這也算是一個應用吧)

     正題:

還是看一下Demo的目錄結構:

                                       

    還是用REST實現一個郵件發送服務:首先需要一些外部JAR包。

                                     

這個文件夾我後邊會上傳打github,當然自己下也可以。把裏面的所有的jar包導入成外部jar包,並且在WEB-INF/lib複製一份

                                      

爲啥要複製到lib下因爲湯姆貓啓動的時候,只會加載lib下的外部jar包,所以以後遇到tomcat報錯無法找到XX類,就去把包複製進就完事了。

然後繼續寫服務類:

hai還是剛纔的sendEmail函數,這裏有幾個很重要的註解,首先是最上面的@Path("/SendService")註解,這裏其實就是在定義這個類的路徑。然後函數上的三個註解,@GET指的是網絡請求方法,@Path()定義了這個函數相對於類的路徑,最後一個Prodeces我也沒仔細看。函數參數的註解,額,沒啥好說的,很normal,就是動態注入時候用的。

最後寫一下配置文件,這個很重要,但是格式幾乎就是固定的:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>CalculatorREST</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>Jersey RESTful Application</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>mypackage</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>Jersey RESTful Application</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>HandleQuery</servlet-name>
    <servlet-class>test.HandEmail</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HandleQuery</servlet-name>
    <url-pattern>/test1</url-pattern>
  </servlet-mapping>
  
  
  
</web-app>

除去我得Servlet(HandleQuery)的配置,上邊的都是這個服務的配置,其實大多都不變,只需要配置一下包名:

                 

服務寫完,直接在項目名上右鍵,run起來,tomcat啓動。

         客戶端如何調用?其實很簡單,REST之所以使用@Path註解一直在註解路徑,就是爲了向外部暴露自己方法的路徑,只要是沿着路徑找到它,然後再把參數給注入進去就完事了。Tomcat通過反射注入參數,實現調用。比如服務器啓動之後,直接再瀏覽器輸入:http://localhost:8080/TestRest/rest/SendService/[email protected]&payload=test

 

解析一下這個地址:首先TestRest是項目名,rest表明我們用rest協議,SendService呢?

再看一下這張圖,我們把類註解爲SendService,所以他會找到這個類,後邊的也是一樣的,找到sendEmail這個方法,然後把參數注入。完成調用。

常見問題:

(1)javax.email找不到?哥哥你要導入啊!!!!!,官網下一個??

(2)SOAP協議發佈的時候,顯示areadyBind???之類的,如果你已經run了一次了,這個端口就被bind了,解決方案:換一個或者從起

(3)SOAP協議是@WebSevice之類的註解失敗??該註解的地方註解一下。。。。。別偷懶

(4)REST協議web.xml配置文件總是出錯???複製我上邊哪個,別瞎改。。。。

(5)REST協議時,注意把javax.email也給加到lib裏

github地址:https://github.com/wsyingang/SA/tree/master/SendEmail

發佈了371 篇原創文章 · 獲贊 50 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章