使用curl指令測試REST服務(转)
curl指令rest
cURL是很方便的Rest客戶端,可以很方便的完成許多RestAPI測試的需求,甚至,如果是需要先登入或認證的restapi,也可以進行測試,利用curl指令,可以送出HTTPGET,POST,PUT,DELETE,也可以改變HTTPheader來滿足使用RESTAPI需要的特定條件。
curl的參數很多,這邊僅列出目前測試REST時常用到的:
-X/--request[GET|POST|PUT|DELETE|…]使用指定的httpmethod發出httprequest
-H/--header設定request裡的header
-i/--include顯示response的header
-d/--data設定httpparameters
-v/--verbose輸出比較多的訊息
-u/--user使用者帳號、密碼
-b/--cookiecookie
linuxcommandline的參數常,同一個功能常會有兩個功能完全相同參數,一個是比較短的參數,前面通常是用-(一個-)導引符號,另一個比較長的參數,通常會用--(兩個-)導引符號
在curl使用說明
-X,--requestCOMMANDSpecifyrequestcommandtouse
--resolveHOST:PORT:ADDRESSForceresolveofHOST:PORTtoADDRESS
--retryNUMRetryrequestNUMtimesiftransientproblemsoccur
--retry-delaySECONDSWhenretrying,waitthismanysecondsbetweeneach
--retry-max-timeSECONDSRetryonlywithinthisperiod>
參數-X跟--request兩個功能是一樣的,所以使用時ex:curl-XPOSThttp://www.example.com/跟curl--requestPOSThttp://www.example.com/是相等的功能
GET/POST/PUT/DELETE使用方式
-X後面加httpmethod,
curl-XGET"http://www.rest.com/api/users"
curl-XPOST"http://www.rest.com/api/users"
curl-XPUT"http://www.rest.com/api/users"
curl-XDELETE"http://www.rest.com/api/users"
url要加引號也可以,不加引號也可以,如果有非純英文字或數字外的字元,不加引號可能會有問題,如果是網碼過的url,也要加上引號
HEADER
在httpheader加入的訊息
curl-v-i-H"Content-Type:application/json"http://www.example.com/users
HTTPParameter
http參數可以直接加在url的querystring,也可以用-d帶入參數間用&串接,或使用多個-d
#使用`&`串接多個參數
curl-XPOST-d"param1=value1¶m2=value2"
#也可使用多個`-d`,效果同上
curl-XPOST-d"param1=value1"-d"param2=value2"
curl-XPOST-d"param1=a0space"
#"aspace"urlencode後空白字元會編碼成'%20'為"a%20space",編碼後的參數可以直接使用
curl-XPOST-d"param1=a%20space"
postjson格式得資料
如同時需要傳送requestparameter跟json,requestparameter可以加在url後面,json資料則放入-d的參數,然後利用單引號將json資料含起來(如果json內容是用單引號,-d的參數則改用雙引號包覆),header要加入”Content-Type:application/json”跟”Accept:application/json”
curlhttp://www.example.com?modifier=kent-XPUT-i-H"Content-Type:application/json"-H"Accept:application/json"-d'{"boolean":false,"foo":"bar"}'
#不加"Accept:application/json"也可以
curlhttp://www.example.com?modifier=kent-XPUT-i-H"Content-Type:application/json"-d'{"boolean":false,"foo":"bar"}'
需先認證或登入才能使用的service
許多服務,需先進行登入或認證後,才能存取其API服務,依服務要求的條件,的curl可以透過cookie,session或加入在header加入sessionkey,apikey或認證的token來達到認證的效果。
session例子:
後端如果是用session記錄使用者登入資訊,後端會傳一個sessionid給前端,前端需要在每次跟後端的requests的header中置入此sessionid,後端便會以此sessionid識別前端是屬於那個session,以達到session的效果
curl--requestGET'http://www.rest.com/api/users'--header'sessionid:1234567890987654321'
cookie例子
如果是使用cookie,在認證後,後端會回一個cookie回來,把該cookie成檔案,當要存取需要任務的url時,再用-bcookie_file的方式在request中植入cookie即可正常使用
#將cookie存檔
curl-i-XPOST-dusername=kent-dpassword=kent123-c~/cookie.txthttp://www.rest.com/auth
#載入cookie到request中
curl-i--header"Accept:application/json"-XGET-b~/cookie.txthttp://www.rest.com/users/1
檔案上傳
curl-i-XPOST-F'file=@/Users/kent/my_file.txt'-F'name=a_file_name'
這個是透過HTTPmultipartPOST上傳資料,-F是使用httpqueryparameter的方式,指定檔案位置的參數要加上@
HTTPBasicAuthentication(HTTP基本認證)
如果網站是採HTTP基本認證,可以使用--userusername:password登入
curl-i--userkent:secrethttp://www.rest.com/api/foo'
認證失敗時,會是401Unauthorized
HTTP/1.1401Unauthorized
Server:Apache-Coyote/1.1
X-Content-Type-Options:nosniff
X-XSS-Protection:1;mode=block
Cache-Control:no-cache,no-store,max-age=0,must-revalidate
Pragma:no-cache
Expires:0
X-Frame-Options:DENY
WWW-Authenticate:Basicrealm="Realm"
Content-Type:text/html;charset=utf-8
Content-Language:en
Content-Length:1022
Date:Thu,15May201406:32:49GMT
認證通過時,會回應200OK
HTTP/1.1200OK
Server:Apache-Coyote/1.1
X-Content-Type-Options:nosniff
X-XSS-Protection:1;mode=block
Cache-Control:no-cache,no-store,max-age=0,must-revalidate
Pragma:no-cache
Expires:0
X-Frame-Options:DENY
Set-Cookie:JSESSIONID=A75066DCC816CE31D8F69255DEB6C30B;Path=/mdserver/;HttpOnly
Content-Type:application/json;charset=UTF-8
Transfer-Encoding:chunked
Date:Thu,15May201406:14:11GMT
可以把認證後的cookie存起來,重複使用
curl-i--userkent:secrethttp://www.rest.com/api/foo'-c~/cookies.txt
登入之前暫存的cookies,可以不用每次都認證
curl-ihttp://www.rest.com/api/foo'-b~/cookies.txt
相關資源
http://linux.about.com/od/commands/l/blcmdl1_curl.htm-curl手冊