一、webservice 的概念
Web 是使應用程序可以與平台和編程語言無關的方式進行相互通信的一項技術。Web 服務是一個軟件接口,它描述了一組可以在網絡上通過標准化的 XML 消息傳遞訪問的操作。它使用基於 XML 語言的協議來描述要執行的操作或者要與另一個 Web 服務交換的數據。一組以這種方式交互的 Web 服務在面向服務的體系結構(Service-Oriented Architecture,SOA)中定義了特殊的 Web 服務應用程序。
簡單的說WebService是一個SOA(面向服務的編程)的架構,它是不依賴於語言,不依賴於平台,可以實現不同的語言(通過 xml 描述)間的相互調用,通過Internet進行基於Http協議的網絡應用間的交互。通過SOAP在Web上提供的軟件服務,使用WSDL文件進行說明,並通過UDDI進行注冊。
XML:(Extensible Markup Language)擴展型可標記語言。面向短期的臨時數據處理、面向萬維網絡,是Soap的基礎。
Soap:(Simple Object Access Protocol)簡單對象存取協議。是XML Web Service 的通信協議。當用戶通過UDDI找到你的WSDL描述文檔后,他通過可以SOAP調用你建立的Web服務中的一個或多個操作。SOAP是XML文檔形式的調用方法的規范,它可以支持不同的底層接口,像HTTP(S)或者SMTP。
WSDL:(Web Services Description Language) WSDL 文件是一個 XML 文檔,用於說明一組 SOAP 消息以及如何交換這些消息。大多數情況下由軟件自動生成和使用。
UDDI (Universal Description, Discovery, and Integration) 是一個主要針對Web服務供應商和使用者的新項目。在用戶能夠調用Web服務之前,必須確定這個服務內包含哪些商務方法,找到被調用的接口定義,還要在服務端來編制軟件,UDDI是一種根據描述文檔來引導系統查找相應服務的機制。UDDI利用SOAP消息機制(標准的XML/HTTP)來發布,編輯,瀏覽以及查找注冊信息。它采用XML格式來封裝各種不同類型的數據,並且發送到注冊中心或者由注冊中心來返回需要的數據。
二、webservice接口測試
測試webservice接口,可以使用soapUI來進行測試,下面簡單用soapUI來調用webservice接口:
1.打開soapUI,新建一個soap工程:
2.我們以天氣預報的wsdl地址為例,導入soapUI查看其中的所有接口信息;
wsdl地址 http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
3、查看接口及報文,輸入參數直接進行調用
發送報文:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://WebXml.com.cn/">
<soapenv:Header/>
<soapenv:Body>
<web:getSupportCity>
<!--Optional:-->
<web:byProvinceName>北京</web:byProvinceName>
</web:getSupportCity>
</soapenv:Body>
</soapenv:Envelope>
返回報文:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<getSupportCityResponse xmlns="http://WebXml.com.cn/">
<getSupportCityResult>
<string>北京 (54511)</string>
<string>上海 (58367)</string>
<string>天津 (54517)</string>
<string>重慶 (57516)</string>
</getSupportCityResult>
</getSupportCityResponse>
</soap:Body>
</soap:Envelope>
1、根元素:Envelope。
2、Header元素::不是強制出現,由程序員控制,主要用於攜帶一些額外的信息,比如用戶名、密碼
3、Body:調用正確,body元素內容應該遵守WSDL要求的格式。
三、HTTP接口
Http協議是建立在TCP協議基礎之上的,當瀏覽器需要從服務器獲取網頁數據的時候,會發出一次Http請求。Http會通過TCP建立起一個到服務器的連接通道,當本次請求需要的數據完畢后,Http會立即將TCP連接斷開,這個過程是很短的。所以Http連接是一種短連接,是一種無狀態的連接。
HTTP協議的主要特點可概括如下:
1.支持客戶/服務器模式。
2.簡單快速:客戶向服務器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與服務器聯系的類型不同。由於HTTP協議簡單,使得HTTP服務器的程序規模小,因而通信速度很快。
3.靈活:HTTP允許傳輸任意類型的數據對象。正在傳輸的類型由Content-Type加以標記。
4.無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,並收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。
5.無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味着如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。
URL解析
在WWW上,每一信息資源都有統一的且在網上唯一的地址,該地址就叫URL(Uniform Resource Locator,統一資源定位符),它是WWW的統一資源定位標志,就是指網絡地址。HTTP協議工作於客戶端-服務端架構之上。瀏覽器作為HTTP客戶端通過URL向HTTP服務端即WEB服務器發送所有請求。Web服務器根據接收到的請求后,向客戶端發送響應信息。
以下面的URL為例:
http://blog.sina.com.cn/s/blog_537ad6610102xtb1.html?tj=hist
1、協議部分,代表頁面使用的是http協議,在Internet中可以使用多種協議,如HTTP,FTP等等。在"HTTP"后面的“//”為分隔符;
2、域名部分,blog.sina.com.cn,也可以使用IP地址作為域名使用如:192.168.55.14:8080,其中8080為端口,域名和端口之間使用“:”作為分隔符。端口不是一個URL必須的部分,如果省略端口部分,將采用默認端口80/tcp;
3、虛擬目錄部分,從域名后的第一個“/”開始到最后一個“/”為止,是虛擬目錄部分。虛擬目錄也不是一個URL必須的部分。本例中的虛擬目錄是“/s/”
4、文件名部分:從域名后的最后一個“/”開始到“?”為止,是文件名部分,如果沒有“?”,則是從域名后的最后一個“/”開始到“#”為止,是文件部分,如果沒有“?”和“#”,那么從域名后的最后一個“/”開始到結束,都是文件名部分。本例中的文件名是“blog_537ad6610102xtb1.html”。文件名部分也不是一個URL必須的部分,如果省略該部分,則使用默認的文件名
5、錨部分:從“#”開始到最后,都是錨部分。錨部分也不是一個URL必須的部分(可以理解為定位)
6、參數部分:從“?”開始到“#”為止之間的部分為參數部分,又稱搜索部分、查詢部分。本例中的參數部分為“7.參數部分:從“?”開始到“#”為止之間的部分為參數部分,又稱搜索部分、查詢部分。本例中的參數部分為“boardID=5&ID=24618&page=1”。參數可以允許有多個參數,參數與參數之間用“&”作為分隔符。”。參數可以允許有多個參數,參數與參數之間用“&”作為分隔符。
二、HTTP協議結構
HTTP請求消息
客戶端發送一個HTTP請求到服務器的請求消息包括以下格式:
請求行(request line)、請求頭部(header)、空行和請求數據四個部分組成。
格式如下:
<request-line>
<headers>
<blank line>
[<request-body>
1、請求行
請求行由請求方法字段、URL字段和HTTP協議版本字段3個字段組成,它們用空格分隔。例如,GET /index.html HTTP/1.1。
HTTP協議的請求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。
最常用的方法有:
GET方法:在瀏覽器的地址欄中輸入網址的方式訪問網頁時,瀏覽器采用GET方法向服務器獲取資源,
POST方法要求被請求服務器接受附在請求后面的數據,常用於提交表單。
2、請求頭部
請求頭部由關鍵字/值對組成,每行一對,關鍵字和值用英文冒號“:”分隔。請求頭部通知服務器有關於客戶端請求的信息,典型的請求頭有:
User-Agent:產生請求的瀏覽器類型。
Accept:客戶端可識別的內容類型列表。
Host:請求的主機名,允許多個域名同處一個IP地址,即虛擬主機。
3、空行
最后一個請求頭之后是一個空行,發送回車符和換行符,通知服務器以下不再有請求頭。
4、請求正文
請求數據不在GET方法中使用,而是在POST方法中使用。POST方法適用於需要客戶填寫表單的場合。與請求數據相關的最常使用的請求頭是Content-Type和Content-Length。
HTTP響應消息
在接收和解釋請求消息后,服務器返回一個HTTP響應消息。
HTTP響應也是由三個部分組成,分別是:狀態行、消息報頭、響應正文
報文格式:
<status-line>
<headers>
<blank line>
[<response-body>]
1、狀態行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服務器HTTP協議的版本;Status-Code表示服務器發回的響應狀態代碼;Reason-Phrase表示狀態代碼的文本描述。
狀態代碼有三位數字組成,第一個數字定義了響應的類別,且有五種可能取值:
1xx:指示信息--表示請求已接收,繼續處理
2xx:成功--表示請求已被成功接收、理解、接受
3xx:重定向--要完成請求必須進行更進一步的操作
4xx:客戶端錯誤--請求有語法錯誤或請求無法實現
5xx:服務器端錯誤--服務器未能實現合法的請求
常見狀態代碼、狀態描述、說明:
200 OK //客戶端請求成功
400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解
401 Unauthorized //請求未經授權,這個狀態代碼必須和WWW-Authenticate報頭域一起使用
403 Forbidden //服務器收到請求,但是拒絕提供服務
404 Not Found //請求資源不存在,eg:輸入了錯誤的URL
500 Internal Server Error //服務器發生不可預期的錯誤
503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間后可能恢復正常
eg:HTTP/1.1 200 OK (CRLF)
2、響應報頭
響應頭用於描述服務器的基本信息,以及數據的描述,服務器通過這些數據的描述信息,可以通知客戶端如何處理等一會兒它回送的數據。
3、響應正文
響應體就是響應的消息體,如果是純數據就是返回純數據,如果請求的是HTML頁面,那么返回的就是HTML代碼,如果是JS就是JS代碼
post與get的區別
測試接口調用演練
get接口
請求URL http://api.nnzhp.cn/api/user/stu_info
- 請求方式 get
- 請求參數
參數名 必選 類型 說明
stu_name 是 string 學生姓名
1、直接用瀏覽器調用
2、使用postman 調用
可以看到postman選擇get方法的時候,body是禁用狀態,get方法的http接口請求,一般數據都放到URL中。
返回的方式同樣也是json串的形式;
3、使用jmeter進行get方法的調用測試
創建線程組
添加HTTP請求
輸入域名、URL、選擇請求方法、添加key
添加查看結果樹
執行接口
可以在查看結果樹中查看執行結果及返回數據
post 請求接口
登錄接口
請求URL
http://api.nnzhp.cn/api/user/login
- 請求方式 post
- 請求參數 參數為key-value形式
參數名 必選 類型 說明
username 是 string 用戶名
passwd 是 string 密碼
登陸用戶名:niuhanyang
密碼:aA123456
返回參數說明
參數名 類型 說明
error_code int 錯誤編碼,0為操作成功
login_info object 登錄對象信息
userId int 用戶id
sign string 簽名
login_time string 登錄時間
1、postman 進行調用
post方法的參數是放在body中的,可以看到參數放到URL中是無效的
把參數放到body中在進行提交
放到body中,以key-value的形式進行傳參,返回json串的形式,參照返回參數說明,可以看到登陸成功。
2、用jmeter 進行調用測試
打開jmeter ->添加->threads->線程組
在線程組中添加->sampler->HTTP請求
輸入域名、URL、選擇方法為post 、輸入參數
執行並查看結果返回值
添加學生信息接口
請求URL:http://api.nnzhp.cn/api/user/add_stu
- 請求方式 post
- 參數 ,入參是json類型
參數名 必選 類型 說明
name 是 string 學生姓名
grade 是 string 班級
phone 是 string 電話
sex 否 string 性別,如果不傳,默認為男
age 否 string 年齡 ,不傳默認為18
add 否 string 地址,如果不傳默認為北京市昌平區
返回參數說明
參數名 類型 說明
error_code int 錯誤編碼,1000為操作成功
msg string 提示信息
如上述描述,入參形式為json 的方式,則使用key-value的形式進行傳參就不行了,如下:
現在我們用正確的入參方式進行調用
1、postman調用
在postman中,選擇方法為post,輸入URL地址,在body中選擇raw ,輸入json串格式的參數
2、使用jmeter調用接口
我們下面看一下jmeter如何進行調用
創建一個http請求,輸入域名、路徑、方法為post、在body data中輸入json ,然后執行
可以在查看結果樹中的請求項中查看請求報文內容
在響應數據中查看響應結果,執行成功
學生金幣充值
請求URL:
http://api.nnzhp.cn/api/user/gold_add
- 請求方式 post
- 參數 ,
該接口有權限驗證,需要admin用戶才可以做操作,需要添加cookie
cookie中key為登錄的用戶名,value從登錄接口中獲取,登陸成功之后會返回sign
參數名 必選 類型 說明
stu_id 是 int 學生id
gold 是 int 金幣數量
返回參數說明
參數名 類型 說明
error_code int 錯誤編碼,0為操作成功
msg string 提示信息
如上述描述,入參形式需要添加cookie
1、postman進行調用,添加cookie的方式
cookie說的直白點就是保存在用戶瀏覽器端的一個鍵值對
提到cookie肯定不能少了session,什么是session呢,session就是保存在服務器的一個鍵值對,一般session都是存在緩存里面,因為要經常用到,要提升性能的話直接把session放到內存里面。
首先我們通過“獲取學生信息”接口查看到學生的id信息,然后通過“登錄”接口,獲取簽名的值如下:以test 用戶為例:
查詢出ID=2341
sign值為:cd2b43f1688e472e3a516b5a2c6831e8
現在為學生添加金幣
2、用jmeter進行接口的調用
用jmeter測試帶cookie的http請求需要添加http cookie管理器
我們先看一下添加cookie的場合進行執行
可以看到沒有添加cookie的場合,執行不成功
現在我們添加httpcookie管理器,右鍵添加->配置元件->HTTP cookie管理器
添加cookie的值
執行,查看請求的數據
獲取所有學生信息
請求URL:
http://api.nnzhp.cn/api/user/all_stu
- 請求方式 get
- 參數 ,需要添加header信息,key為Referer value 為http://api.nnzhp.cn/
返回參數說明
參數名 類型 說明
error_code int 錯誤編碼,0為操作成功
all_stu list 提示信息
1、我們看一下不添加header,直接用瀏覽器地址欄訪問的結果
如下,不添加header訪問,提示來路不正確
2、用postman進行調用,添加header信息,並進行調用
執行,結果顯示所有的學生用戶信息
3、用jmeter進行調用測試
添加http請求
右鍵添加->配置元件->http信息頭管理器
執行結果成功,顯示學生信息
文件上傳類型
請求URL:
http://api.nnzhp.cn/api/file/file_upload
- 請求方式 post
- 參數
參數名 必選 類型 說明
file 是 file 文件
返回參數說明
參數名 類型 說明
error_code int 錯誤編碼,0為操作成功
msg string 提示信息
1、用postman進行調用,輸入URL地址,key的類型選擇file類型
選擇文件進行上傳
執行操作成功
2、使用jmeter進行調用
執行,操作成功
好了先這么多,期待后續。。。