導航:首頁 > 程序命令 > curl命令要加埠嗎

curl命令要加埠嗎

發布時間:2022-05-21 22:02:07

A. 如何用php連接 curl方式的介面

-H表示curl命令的header,對應php中可以使用:
$header=array(
"X-Udemy-Client-Id:MYCLIENTID",
"X-Udemy-Client-Secret:MYCLIENTSECRET",
);

curl_setopt($ch,CURLOPT_HTTPHEADER,$header);//$ch=curl_init($url);

更多關於curl的應用可以參考我的博客《PHPcURL應用》
http://www.zjmainstay.cn/php-curl

B. 如何使用CURL復用連接

HTTP1.0與HTTP1.1的一個很大的差別是HTTP1.1支持長連接。現實中有很多這個場景,就是請求了一個頁面,然後這個頁面的其他內容,例如CSS文件,JS文件都要從同一個服務(相同伺服器,相同埠)上面獲取。這些向相同伺服器的請求如果能夠復用連接,是很有利於提供網路性能。
總的來說,復用HTTP連接有兩個好處:
1. 節省系統埠資源(每一次連接都要使用埠,埠的資源是有限的)
2. 節省創建socket連接的時間。

下面講講在PHP下面,如何使用CURL來復用連接:
curl是在一個handle裡面復用連接的,所以這樣就可以復用連接了:
$ch = curl_init();
$ret = curl_exec($ch);
......
$ret2 = curl_exec($ch);
....
curl_close($ch);
在初始化跟關閉$ch資源時即可復用連接。

我這里寫了兩個函數,可以支持GET跟POST的請求,大家感興趣可以看看。

function curl_get($url, $timeout=5) {
global $g_handle;
if (empty($g_handle)) $ch = curl_init();

$options = array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FRESH_CONNECT => false,
CURLOPT_FORBID_REUSE => false,
CURLOPT_TIMEOUT => $timeout
);
curl_setopt_array($g_handle, $options);

$ret = curl_exec($g_handle);
return $ret;
}

// 可以支持POST數據,$post是一個數組,$timeout是超時時間。
function curl_post($url, $post=array(), $timeout=10) {
global $g_handle;
if (empty($g_handle)) $g_handle = curl_init();

$options = array(
CURLOPT_URL => $url,
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FRESH_CONNECT => false,
CURLOPT_FORBID_REUSE => false,
CURLOPT_TIMEOUT => $timeout,
CURLOPT_POSTFIELDS => http_build_query($post)
);
if (empty($post)) $options[CURLOPT_POST] = false;

curl_setopt_array($g_handle, $options);

$ret = curl_exec($g_handle);
return $ret;
}

C. linux curl命令:curl: (7) couldn't connect to host

如果是CentOS-6,並且保證其他沒做錯誤
一、輸入下面命令葯到病除
1、service NetworkManager stop

2、chkconfig NetworkManager off

3、service network restart
二、不行,再看看
curl -I http://www.test.com/
報錯就是你網路有問題,沒有報錯就是你配置有問題。

D. php的curl和socket的區別

首先說下啥是socket:
PHP使用berkely的socket庫來創建他的連接,socket是一個數據結果,你可以通過這個socket來開啟伺服器和客戶端的會話。伺服器端一直處於監聽狀態,當一個客戶端連接伺服器,他就打開伺服器端正在監聽的一個埠進行會話。這時伺服器端接收客戶端的連接請求,那麼就進行一次循環。現在這個客戶端就能夠發送信息到伺服器,伺服器也可以發送信息給客戶端。
產生一個socket你一共需要三個變數:
1、一個協議
2、一個socket類型
3、一個公共協議類型
以下是對這三個變數的詳細解釋,大概了解下吧(但願你能記得住偷笑)
協議:產生一個socket有三個協議供選擇:
1、AF_INET 這個是使用比較廣泛的產生socket的協議,使用tcp或者udp協議傳輸,使用ipv4地址
2、AF_INET6 顯而易見哈,同上,不同的是使用ipv6地址
3、AF_UNIX 使用在unix或者Linux機器上,這個很少使用,僅在伺服器端和客戶端均為unix或者linux系統上使用。
socket類型:
1、SOCK_STREAM 這個協議是按照順序的、可靠的、數據完整的基於位元組流的連接。這是一個使用最多的socket類型,這個socket是使用TCP來進行傳輸。
2、SOCK_DGRAM 這個協議是無連接的、固定長度的傳輸調用。該協議是不可靠的,使用UDP來進行它的連接。
3、SOCK_SEQPACKET 這個協議是雙線路的、可靠的連接,發送固定長度的數據包進行傳輸。必須把這個包完整的接受才能進行讀取。
4、SOCK_RAW 這個socket類型提供單一的網路訪問,這個socket類型使用ICMP公共協議。(ping、traceroute使用該協議)
5、SOCK_RDM 這個類型是很少使用的,在大部分的操作系統上沒有實現,它是提供給數據鏈路層使用,不保證數據包的順序
公共協議類型:
1、ICMP (Internet Control Message Protocol)互聯網控制報文協議,主要用在網關和主機上,用來檢測網路狀況和報告錯誤信息
2、TCP (Transmission Control Protocol) 傳輸控制協議,他是使用最廣泛的協議,他能夠保證數據包到達接收者那裡,如果中途出現錯誤,那麼此協議從新發送數據包。
3、UDP (User Datagram Protocol)用戶數據包協議,他是無連接的,不可靠的數據傳輸協議。
好啦,你現在知道了產生一個socke需要三個元素,那麼在php中socket_create()就需要三個參數,一個協議,一個socket類型,一個公共協議。如果創建成功,socket_create()返回一個socket資源類型,如果不成功,嘿嘿,那你會收到一個false.
CURL
cURL 是利用URL語法規定來傳輸文件和數據的工具。他支持HTTP、FTP、TELNET。
為啥要使用cURL呢?
因為,如果我們有時候想靈活的獲取網頁上的內容,例如處理coockies、驗證、表單提交、文件上傳等等等等。那麼你就需要用到cURL.據說php有著功能強大的cURL庫(因為偶也說不清強大在哪裡啦,所以用了「據說」大笑)。
php使用cURL的選項基本步驟如下:
1、初始化
2、參數設置
3、頁面內容獲取或者操作
4、釋放句柄
看看下面這個簡單的例子吧。
[php] view plain
<?php
//初始化curl
$ch = curl_init ();
/*
* 設置curl
* php手冊對於curl_setopt的解釋為:設置對於curl傳輸的操作
* curl_setopt有三個參數:資源(一般為你建立的curl句柄)、操作(你將對這個句柄作何操作)、參數(對於這個操作你給出的參數)
*/
//例如你想對網路進行某些操作
curl_setopt ( $ch, CURLOPT_URL, "http://www..com");
//現在看來你要向網路post數據
curl_setopt ( $ch, CURLOPT_POST, 1 );
/*給出了要post的數據:$post_string,post的數據可以是一個文件,
*那麼你需要以@加上文件的全路徑給出,或者你要post一些數據,
*那麼你可以按照數組形式給出,或者按照字元串給出,
*如果你想按照字元串形式給出,請把字元串urlencode,嘿嘿
*/
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $post_string );
/*
*把curl操作的結果以字元串形式 從curl_exec ()返回,而不是直接就輸出了
*/
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
//得到操作返回結果
$result = curl_exec ( $ch );
//關閉curl句柄
curl_close ( $ch );
?>
因為php的curl有很多操作,要都記住估計很困難,反正偶記不住啦,說些大家可能用的上的吧。大笑
獲取伺服器的一些信息
[php] view plain
<?php
//初始化curl
$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, "http://www..com");
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
curl_exec($ch);
$info = curl_getinfo($ch);
var_mp($info);
?>
通過上面的例子,你將會獲得如下信息:
「url」 //資源網路地址
「content_type」 //內容編碼
「http_code」 //HTTP狀態碼
「header_size」 //header的大小
「request_size」 //請求的大小
「filetime」 //文件創建時間
「ssl_verify_result」 //SSL驗證結果
「redirect_count」 //跳轉技術
「total_time」 //總耗時
「namelookup_time」 //DNS查詢耗時
「connect_time」 //等待連接耗時
「pretransfer_time」 //傳輸前准備耗時
「size_upload」 //上傳數據的大小
「size_download」 //下載數據的大小
「speed_download」 //下載速度
「speed_upload」 //上傳速度
「download_content_length」//下載內容的長度
「upload_content_length」 //上傳內容的長度
「starttransfer_time」 //開始傳輸的時間
「redirect_time」//重定向耗時

E. 請教高手關於php中用curl向https:// post數據的問題

呵呵,https一般是443埠,你沒指定埠,當然不成了。。。。你用的是默認的80埠啊

F. PHP 通過curl下載ftp文件,怎麼設置埠號

ftp://172.19.71.63:8080/Flipped.2010.BluRay.720p.DTS.x264-CHD.sample.mkv

G. 如果伺服器端的ftp或http服務的埠號不是默認的21或80,如何使用curl命令下載文件

httpftp協議在使用默認埠的情況下,瀏覽器和ftp軟體在沒有設置情況下會自動嘗試連接該服務的默認埠。如在伺服器上修改了其服務的默認埠,你在嘗試使用該服務的客戶機上必須指定特定的埠號,匹配你伺服器所設定的。

例如linux下使用apache創建了虛擬站點(伺服器),並使用了88埠你在訪問這個虛擬站點就必須指定埠號,如

"http://virtual.website.com:88/path"

#:80在網址後添加分號並指定埠號。其後可以指定網站的路徑和頁面,一般不指定。

linux環境下常用apache架設web伺服器(至少我的是=ω=),修改httpd.conf中的默認監聽埠Listen80#

如若是虛擬站點需修改

NameVirtualHost*:80

<VirtualHost*:80>

兩項

至於ftp,由於不清楚你使用的是哪款軟體驅動服務的,所以不做解釋(無需必要,參考軟體設置文檔或告知軟體名並提問)

PSvsftpd修改vsftpd.conf中的listen_port=21

H. curl的用法

curl是一個利用URL語法在命令行方式下工作的文件傳輸工具。本文介紹了它的簡單用法。

*******************************************************************************************************************************************************

curl是一個利用URL語法在命令行方式下工作的文件傳輸工具。

它支持很多協議:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。
curl同樣支持HTTPS認證,HTTP POST方法, HTTP PUT方法, FTP上傳, kerberos認證, HTTP上傳, 代理伺服器, cookies, 用戶名/密碼認證, 下載文件斷點續傳, 上載文件斷點續傳, http代理伺服器管道( proxy tunneling), 甚至它還支持IPv6, socks5代理伺服器, 通過http代理伺服器上傳文件到FTP伺服器等等,功能十分強大。

Windows操作系統下的網路螞蟻,網際快車(FlashGet)的功能它都可以做到。准確的說,curl支持文件的上傳和下載,所以是一個綜合傳輸工具,但是按照傳統,用戶習慣稱curl為下載工具。

curl是瑞典curl組織開發的,您可以訪問: http://curl.haxx.se/
獲取它的源代碼和相關說明。

鑒於curl在Linux上的廣泛使用,IBM在AIX Linux Toolbox的光碟中包含了這個軟體,並且您可以訪問IBM網站:

http://www- 1.ibm.com/servers/aix/procts/aixos/linux/altlic.html 下載它。

curl的最新版本是 7.10.8,IBM網站上提供的版本為7.9.3。

在AIX下的安裝很簡單,IBM網站上下載的rpm格式的包。

在 http://curl.haxx.se/docs/,您可以下載到UNIX格式的man幫助,裡面有詳細的curl工具的使用說明。
curl的用法為:curl [options] [URL...]
其中options是下載需要的參數,大約有80多個,curl的各個功能完全是依靠這些參數完成的。
具體參數的使用,用戶可以參考curl的man幫助。
下面,本文就將結合具體的例子來說明怎樣利用curl進行下載。

1、獲得一張頁面

使用命令:curl http://curl.haxx.se
這是最簡單的使用方法。用這個命令獲得了http://curl.haxx.se指向的頁面,同樣,如果這里的URL指向的是一個文件或者一幅圖都可以直接下載到本地。如果下載的是HTML文檔,那麼預設的將不顯示文件頭部,即HTML文檔的header。要全部顯示,請加參數 -i,要只顯示頭部,用參數 -I。任何時候,可以使用 -v 命令看curl是怎樣工作的,它向伺服器發送的所有命令都會顯示出來。為了斷點續傳,可以使用-r參數來指定傳輸范圍。

2、表單(Form)的獲取

在WEB頁面設計中,form是很重要的元素。Form通常用來收集並向網站提交信息。提交信息的方法有兩種,GET方法和POST方法。先討論GET方法,例如在頁面中有這樣一段:
<form method="GET" action="junk.cgi">
<input type=text name="birthyear">
<input type=submit name=press value="OK">
</form>
那麼瀏覽器上會出現一個文本框和一個標為「OK」的按鈕。按下這個按鈕,表單就用GET方法向伺服器提交文本框的數據。
例如原始頁面是在 www.hotmail.com/when/birth.html看到的,然後您在文本框中輸入1905,然後按OK按鈕,那麼瀏覽器的URL現在應該是:「www.hotmail.com/when/junk.cgi?birthyear=1905&;press=OK」
對於這種網頁,curl可以直接處理,例如想獲取上面的網頁,只要輸入:

curl "www.hotmail.com/when/junk.cgi?birthyear=1905&;press=OK"

就可以了。

表單用來提交信息的第二種方法叫做POST方法,POST方法和GET方法的區別在於GET方法使用的時候,瀏覽器中會產生目標URL,而POST不會。類似GET,這里有一個網頁:
<form method="POST" action="junk.cgi">
<input type=text name="birthyear">
<input type=submit name=press value="OK">
</form>
瀏覽器上也會出現一個文本框和一個標為「OK」的按鈕。按下這個按鈕,表單用POST方法向伺服器提交數據。

這時的URL是看不到的,因此需要使用特殊的方法來抓取這個頁面:

curl -d "birthyear=1905&press=OK" www.hotmail.com/when/junk.cgi
這個命令就可以做到。
1995年年末,RFC 1867定義了一種新的POST方法,用來上傳文件。主要用於把本地文件上傳到伺服器。此時頁面是這樣寫的:
<form method="POST" enctype='multipart/form-data' action="upload.cgi">
<input type=file name=upload>
<input type=submit name=press value="OK">
</form>

對於這種頁面,curl的用法不同:
curl -F upload=@localfilename -F press=OK URL

這個命令的實質是將本地的文件用POST上傳到伺服器。
有關POST還有不少用法,用戶可以自己摸索。

3、使用PUT方法。

HTTP協議文件上傳的標准方法是使用PUT,此時curl命令使用-T參數:
curl -T uploadfile www.uploadhttp.com/receive.cgi

4、有關認證。

curl可以處理各種情況的認證頁面,例如下載用戶名/密碼認證方式的頁面(在IE中通常是出現一個輸入用戶名和密碼的輸入框):
curl -u name:password www.secrets.com
如果網路是通過http代理伺服器出去的,而代理伺服器需要用戶名和密碼,那麼輸入:
curl -U proxyuser:proxypassword http://curl.haxx.se
任何需要輸入用戶名和密碼的時候,只在參數中指定用戶名而空著密碼,curl可以互動式的讓用戶輸入密碼。

5、引用。

有些網路資源訪問的時候必須經過另外一個網路地址跳轉過去,這用術語來說是:referer,引用。
對於這種地址的資源,curl也可以下載:
curl -e http://curl.haxx.se daniel.haxx.se

6、指定用戶客戶端。

有些網路資源首先需要判斷用戶使用的是什麼瀏覽器,符合標准了才能夠下載或者瀏覽。
此時curl可以把自己「偽裝」成任何其他瀏覽器:
curl -A "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" URL

這個指令表示curl偽裝成了IE5.0,用戶平台是Windows 2000。(對方伺服器是根據這個字串來判斷客戶端的類型的,所以即使使用AIX也無所謂)。
使用:
curl -A "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" URL

此時curl變成了Netscape,運行在PIII平台的Linux上了。

7、COOKIES

Cookie是伺服器經常使用的一種記憶客戶信息的方法。如果cookie被記錄在了文件中,那麼使用命令:
curl -b stored_cookies_in_file www.cookiesite.com
curl可以根據舊的cookie寫出新cookie並發送到網站:
curl -b cookies.txt -c newcookies.txt www.cookiesite.com

8、加密的HTTP——HTTPS。

如果是通過OpenSSL加密的https協議傳輸的網頁,curl可以直接訪問:
curl https://that.secure.server.com

9、http認證。

如果是採用證書認證的http地址,證書在本地,那麼curl這樣使用:
curl -E mycert.pem https://that.secure.server.com

參考讀物和注意事項:

curl非常博大,用戶要想使用好這個工具,除了詳細學習參數之外,還需要深刻理解http的各種協議與URL的各個語法。
這里推薦幾個讀物:

RFC 2616 HTTP協議語法的定義。
RFC 2396 URL語法的定義。
RFC 2109 Cookie是怎樣工作的。
RFC 1867 HTTP如何POST,以及POST的格式。

文字

curl是免費軟體,IBM公司對curl不提供技術支持。

curl官方網站:
http://curl.haxx.se

I. curl命令應該放在c盤哪個文件下

下載單個文件,默認將輸出列印到標准輸出中(STDOUT)中
curl http://www.centos.org

通過-o/-O選項保存下載的文件到指定的文件中:
-o:將文件保存為命令行中指定的文件名的文件中
-O:使用URL中默認的文件名保存文件到本地
1 # 將文件下載到本地並命名為mygettext.html
2 curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html
3
4 # 將文件保存到本地並命名為gettext.html
5 curl -O http://www.gnu.org/software/gettext/manual/gettext.html

同樣可以使用轉向字元">"對輸出進行轉向輸出
同時獲取多個文件
1 curl -O URL1 -O URL2

若同時從同一站點下載多個文件時,curl會嘗試重用鏈接(connection)。
通過-L選項進行重定向
默認情況下CURL不會發送HTTP Location headers(重定向).當一個被請求頁面移動到另一個站點時,會發送一個HTTP Loaction header作為請求,然後將請求重定向到新的地址上。
例如:訪問google.com時,會自動將地址重定向到google.com.hk上。

1 curl http://www.google.com
2 <HTML>
3 <HEAD>
4 <meta http-equiv="content-type" content="text/html;charset=utf-8">
5 <TITLE>302 Moved</TITLE>
6 </HEAD>
7 <BODY>
8 <H1>302 Moved</H1>
9 The document has moved
10 <A HREF="http://www.google.com.hk/url?sa=p&hl=zh-CN&pref=hkredirect&pval=yes&q=http://www.google.com.hk/&ust=1379402837567135amp;usg=">here</A>.
11 </BODY>
12 </HTML>

上述輸出說明所請求的檔案被轉移到了http://www.google.com.hk。
這是可以通過使用-L選項進行強制重定向
1 # 讓curl使用地址重定向,此時會查詢google.com.hk站點
2 curl -L http://www.google.com

斷點續傳
通過使用-C選項可對大文件使用斷點續傳功能,如:

1 # 當文件在下載完成之前結束該進程
2 $ curl -O http://www.gnu.org/software/gettext/manual/gettext.html
3 ############## 20.1%
4
5 # 通過添加-C選項繼續對該文件進行下載,已經下載過的文件不會被重新下載
6 curl -C - -O http://www.gnu.org/software/gettext/manual/gettext.html
7 ############### 21.1%

對CURL使用網路限速
通過--limit-rate選項對CURL的最大網路使用進行限制
1 # 下載速度最大不會超過1000B/second
2
3 curl --limit-rate 1000B -O http://www.gnu.org/software/gettext/manual/gettext.html

下載指定時間內修改過的文件
當下載一個文件時,可對該文件的最後修改日期進行判斷,如果該文件在指定日期內修改過,就進行下載,否則不下載。
該功能可通過使用-z選項來實現:
1 # 若yy.html文件在2011/12/21之後有過更新才會進行下載
2 curl -z 21-Dec-11 http://www.example.com/yy.html

CURL授權
在訪問需要授權的頁面時,可通過-u選項提供用戶名和密碼進行授權
1 curl -u username:password URL
2
3 # 通常的做法是在命令行只輸入用戶名,之後會提示輸入密碼,這樣可以保證在查看歷史記錄時不會將密碼泄露
4 curl -u username URL

從FTP伺服器下載文件
CURL同樣支持FTP下載,若在url中指定的是某個文件路徑而非具體的某個要下載的文件名,CURL則會列出該目錄下的所有文件名而並非下載該目錄下的所有文件
1 # 列出public_html下的所有文件夾和文件
2 curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/
3
4 # 下載xss.php文件
5 curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/xss.php

上傳文件到FTP伺服器
通過 -T 選項可將指定的本地文件上傳到FTP伺服器上

# 將myfile.txt文件上傳到伺服器
curl -u ftpuser:ftppass -T myfile.txt ftp://ftp.testserver.com

# 同時上傳多個文件
curl -u ftpuser:ftppass -T "{file1,file2}" ftp://ftp.testserver.com

# 從標准輸入獲取內容保存到伺服器指定的文件中
curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt

獲取更多信息
通過使用 -v 和 -trace獲取更多的鏈接信息
通過字典查詢單詞

1 # 查詢bash單詞的含義
2 curl dict://dict.org/d:bash
3
4 # 列出所有可用詞典
5 curl dict://dict.org/show:db
6
7 # 在foldoc詞典中查詢bash單詞的含義
8 curl dict://dict.org/d:bash:foldoc

為CURL設置代理
-x 選項可以為CURL添加代理功能
1 # 指定代理主機和埠
2 curl -x proxysever.test.com:3128 http://google.co.in

其他網站整理
保存與使用網站cookie信息
1 # 將網站的cookies信息保存到sugarcookies文件中
2 curl -D sugarcookies http://localhost/sugarcrm/index.php
3
4 # 使用上次保存的cookie信息
5 curl -b sugarcookies http://localhost/sugarcrm/index.php

傳遞請求數據
默認curl使用GET方式請求數據,這種方式下直接通過URL傳遞數據
可以通過 --data/-d 方式指定使用POST方式傳遞數據

1 # GET
2 curl -u username https://api.github.com/user?access_token=XXXXXXXXXX
3
4 # POST
5 curl -u username --data "param1=value1¶m2=value" https://api.github.com
6
7 # 也可以指定一個文件,將該文件中的內容當作數據傳遞給伺服器端
8 curl --data @filename https://github.api.com/authorizations

註:默認情況下,通過POST方式傳遞過去的數據中若有特殊字元,首先需要將特殊字元轉義在傳遞給伺服器端,如value值中包含有空格,則需要先將空格轉換成%20,如:
1 curl -d "value%201" http://hostname.com

在新版本的CURL中,提供了新的選項 --data-urlencode,通過該選項提供的參數會自動轉義特殊字元。
1 curl --data-urlencode "value 1" http://hostname.com

除了使用GET和POST協議外,還可以通過 -X 選項指定其它協議,如:
1 curl -I -X DELETE https://api.github.cim

上傳文件
1 curl --form "[email protected]" http://hostname/resource

J. 如何利用cURL和python對服務端和web端進行介面測試

工具描述
cURL是利用URL語法在命令行方式下工作的文件傳輸工具,是開源愛好者編寫維護的免費工具,支持包括Windows、Linux、Mac等數十個操作系統,最新版本為7.27.0,但是我推薦大家使用7.26.0,從這里可以下載7.26.0版本。
以下是官方介紹的翻譯: cURL是一個使用URL語法來傳輸數據的命令行工具,支持DICT,FILE,FTP,FTPS,GOPHER,HTTP,HTTPS,IMAP,IMAPS,LDAP,LDAPS,POP3,POP3S,RTMP,RTSP,SCP,SFTP,SMTP,SMTPS,Telnet和TFTP。 cURL支持SSL證書,HTTP POST,HTTP PUT,FTP上傳,HTTP基礎表單上傳,代理,cookies,用戶+密碼身份驗證(Basic, Digest, NTLM, Negotiate, kerberos...),恢復文件傳輸,隧道代理等等。
Python是一種面向對象、直譯式計算機程序設計語言,由Guido van Rossum於1989年底發明,它的強大和易用就無需多做說明了,在web開發中或者對開發速度要求較高的開發中應用十分廣,不過因為屬於腳本類語言,它的性能始終比不上C++、C等語言。
本文主要利用實例說明這兩款工具的在測試中的部分用途,更多用法留待大家繼續探索。
應用場景
使用cURL模擬客戶端對服務端進行查詢
在進行介面測試時,應該先找開發人員提供介面列表和對應參數,這樣測試的時候就可以驗證測試方法是否正確,不過如果可以用瀏覽器模擬操作的話,也可以自己先試試的,後面的例子會提到。
首先使用客戶端訪問需要測試的服務端介面,用wireshark抓包結果如下:

把查詢字元串以multipart方式post數據到伺服器的file_health_info.php介面。
Tips:
Windows版的cURL不像Linux或者Mac一樣屬於系統自帶工具,需要下載,如果要在命令提示符下使用就需要跳轉到工具所在目錄下才能運行,十分麻煩,我們可以直接把這個工具文件放到Windows目錄下,這樣無論在哪個目錄都可以直接使用「curl」命令運行工具了。
cURL默認就是以post方式發送數據的,所以只需要加入multipart方式就可以了,-F在cURL幫助中的解釋是:

-F, --form CONTENT Specify HTTP multipart POST data (H)
--form-string STRING Specify HTTP multipart POST data (H)
--ftp-account DATA Account data string (F)
--ftp-alternative-to-user COMMAND String to replace "USER [name]" (F)
--ftp-create-dirs Create the remote dirs if not present (F)
--ftp-method [MULTICWD/NOCWD/SINGLECWD] Control CWD usage (F)
--ftp-pasv Use PASV/EPSV instead of PORT (F)

Specify HTTP multipart POST data正好滿足我們的要求,所以模擬的語句是:
curl -F "newmd5=###25016566###d:\test.exe###1###" file_health_info.php
後面的都是參數,測試前就要找開發確認好。
不過因為服務端支持以gzip方式返回數據,所以我們還可以在請求中加入—compressed參數,即是:
curl --compressed -F "newmd5=###25016566###d:\test.exe###1###"file_health_info.php
為了更好判斷服務端介面是否正常,除了對返回數據進行判斷外,我們還需要對服務端返回的數據包頭進行解析,所以還可以在cURL請求中加入-i參數,最終這個測試語句就變為:
curl –i --compressed -F "newmd5=###25016566###d:\test.exe###1###"file_health_info.php
模擬完成後就要考慮判斷返回值的事了,我們首先在命令提示符下運行這個語句,看看返回值。
運行以上命令後,返回的數據如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

HTTP/1.1 100 Continue
HTTP/1.1 200 OK
Date: Fri, 24 Aug 2012 07:47:45 GMT
Content-Type: application/xml
Transfer-Encoding: chunked
Connection: keep-alive
Server: 360 web server
Content-Encoding: gzip
<?xml version="1.0" encoding="GBK" ?>
<ret>
<retinfo code="0" msg="Operation success" total="1" success="1" empty="0"
cost="999.92752075195"/>
<softs>
<soft>
<md5></md5>
<sha1></sha1>
<level>4040</level>
<e_level>40.3</e_level>
<size></size>
<soft_name><![CDATA[]]> </soft_name>
<describ><![CDATA[]]></describ>
<file_desc><![CDATA[]]></file_desc>
<upload>0</upload>
<attr_upload>2</attr_upload>
<class><![CDATA[private]]></class>
<malware><![CDATA[cloud.virus]]></malware>
<is_sys_file>0</is_sys_file>
<is_rep>0</is_rep>
<age>0</age>
<pop>0</pop>
</soft>
</softs>
</ret>

數據包包頭是常見的,一般來說,我們只要判斷包頭中含有「HTTP/1.1 200 OK」就可以確定服務端正常返回了數據。另外從內容可以看到這是一個xml格式的數據包,我們只需要判斷是否存在關鍵的欄位即可,比如<level>,確定這些之後我們就可以在python中添加如下案例代碼了:
首先運行指定的curl命令:
response = os.popen('''curl -i --compressed -F "newmd5=###25016566###d:\test.exe###1###"
然後判斷返回值中是否存在我們想要的欄位:
self.assertNotEqual(response.find('HTTP/1.1 200 OK'),-1)
self.assertNotEqual(response.find('<level>'),-1)
上面的內容看起來差不多可以了,但實際還不夠嚴謹,因為服務端返回的這些數據是從資料庫中獲取的,所以我們還需要查詢資料庫獲取指定值,判斷是否和數據包中的一致,比如<level>:
首先使用python登錄資料庫伺服器:
conn = MySQLdb.connect(host='172.22.54.31', user='user',passwd='test321',db='cloud')
cursor = conn.cursor()
count = cursor.execute('SELECT plevel FROM file where md5=""')
result = cursor.fetchone()
然後判斷返回值中的level是否資料庫中的值:
self.assertNotEqual(response.find('''<level>%s</level>'''%result[0]),-1)
測試時除了使用cURL等工具進行模擬,還可以自己用python或其他語言寫代碼進行post數據,不過當時簡單起見所以就選擇了用cURL測試。

使用cURL模擬控制台登錄
說到模擬登錄或者模擬點擊,很多同學可能直接聯想到QTP等模擬界面操作的工具,事實上這種工具有一個很大的弊端是太依賴控制項,如果界面控制項變了,那麼可能整個腳本就無效了,現在的程序設計都傾向界面邏輯分離,這樣修改界面時就不會動到底下的功能介面,開發人員可以隨時修改界面控制項,如果還是採取QTP等模擬點擊的方法測試,結果可能是事倍功半的,如果測試時直接點用介面就可以避免這種問題。
下面的例子是模擬控制台登錄的,登錄URL為:
index.php?r=site/login ,首先使用瀏覽器登錄一次,看看實際效果如何。
Tips:
測試php或其他web程序時建議使用chrome,因為它自帶的Developer Tools十分好用,當然firefox或者IE9也有類似的工具,看個人習慣吧。按F12打開工具,選擇Network標簽頁,然後輸入用戶名、密碼點擊登錄,這時Network下方會顯示登錄過程中瀏覽器想控制台請求的所有數據,包括請求類型、表單數據等,這些是我們模擬操作的數據來源。

從上圖可以獲取幾個重點信息:請求URL、請求類型、數據類型、數據內容、並且支持gzip壓縮等。我們用curl模擬如下:
curl -i --compressed cloud/index.php?r=site/login -d 「username=admin」 -d 「userpass=admin」
使用-i和—compressed的原因再上一個例子已經說了,這里不再贅述,重點是後面的-d,它在官方幫助的解釋是:

-d, --data DATA HTTP POST data (H)
--data-ascii DATA HTTP POST ASCII data (H)
--data-binary DATA HTTP POST binary data (H)
--data-urlencode DATA HTTP POST data url encoded (H)
--delegation STRING GSS-API delegation permission
--digest Use HTTP Digest Authentication (H)
--disable-eprt Inhibit using EPRT or LPRT (F)
--disable-epsv Inhibit using EPSV (F)

而我們從Developer Tools返回的數據已經知道,返回數據的格式是
「application/x-www-form-urlencoded」,所以很明顯需要使用-d的HTTP POST data url encoded特性。不過格式中還有關鍵字form,莫非也支持-F參數登錄,試試:
curl -i --compressed cloud/index.php?r=site/login -F 「username=admin」 -F 「userpass=admin」,果然成功,呵呵~
也許有同學有疑問,為何不模擬warnsetup、refer,這是因為測試時發現登錄界面只需要用戶名和密碼就夠了,refer 用於記錄來源網頁,在這里用處不大,warnsetup只是用於驗證登錄碼的,這個已經去掉了。
接下來要驗證數據,我們在命令提示符中運行上面的命令,返回結果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13

HTTP/1.1 302 Moved Temporarily
Date: Fri, 24 Aug 2012 08:29:07 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.4.3
Set-Cookie: PHPSESSID=; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: PHPSESSID=; path=/
Location: ./index.php
Server: 360 web server

很奇怪吧,乍一看控制台沒有返回任何有用信息,不過裡面那句HTTP/1.1 302 Moved Temporarily是不是特別眼熟?這個特殊的302(表示http重定向)正是我們在Developer Tools看到的狀態值,看到這個已經可以80%確定我們登錄已經成功了,更重要的是返回包中的內容:Location: ./index.php,這說明控制台已經通知請求端跳轉到index.php,如果登錄失敗控制台會繼續停留在當前登錄界面的,我們只需要修改curl語句中的用戶名或者密碼就知道了,這種情況下返回包就是登錄界面的php源碼,這里不再贅述。
使用cURL以get方式測試控制台搜索介面
測試方法同上面差不多,首先使用chrome打開控制台進入對應頁面,在搜索框中輸入「test.exe」,點擊搜索,使用developer tools抓包,內容如下:

cURL模擬get方式發送數據的參數是-G,了解這個後面要模擬就很簡單了:
curl -i --compressed -G 「cloud/index.php?r=file_cloud/api/search&filename=&bg=0&lm=19 」
其中每個參數的含義要分別了解:filename表示輸入的關鍵字,bg表示資料庫第一行,lm表示共顯示19行數據。這個介面返回的數據如下:
{"rows":[{"level":"10","plevel":"10","id":"20","md5":"","soft_name":"","soft_desc":"","file_desc":"","is_sys_file":"127","size":"41984","is_rep":"0","file_name":"apihex86.d
ll","file_version":"6.1.7600.16385","proct_version":"6.1.7600.16385","right":"\u00a9 Microsoft Corporation. All rights reserved.","lang":"0","org_name":"YXBpaGV4ODYuZGxs","sign_name":"TWljcm9zb2Z0IFdpbmRvd3M=","company_name":"Microsof
t Corporation","update_time":"2012-07-31 18:14:27","create_time":"2012-07-31 18:14:27","creator_mid":""}],"count":"1"}
分別是文件屬性和文件信息,這涉及到兩個資料庫表,所以驗證數據需要用python從兩張表中獲取對應信息。
從第一張表獲取文件屬性,比如只獲取plevel:
SELECT plevel FROM `file` where md5=""
從第二張表獲取文件信息,比如只獲取company_name:
SELECT company_name FROM file_info where md5=""
Python代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

conn = MySQLdb.connect(host='%s'% self.host, user='user',passwd='test321',db='cloud')

cursor = conn.cursor()

count = cursor.execute('SELECT plevel FROM `file` where md5=""')

result = cursor.fetchone()

self.assertNotEqual(response.find(str(result[0])),-1)

count = cursor.execute('SELECT company_name FROM file_info where md5=""')

result1 = cursor.fetchone()

self.assertNotEqual(response.find(result1[0]),-1)

當然嚴謹的測試案例是每一個屬性欄位都需要進行查找和匹配,這里就不再贅述了。
後記:這種介面測試用到的無非就是curl、python的unitest而已,可能有的人會疑問,為什麼用curl而不用py自帶的pycurl或者request之類,我覺得只要能滿足需求,能夠用現成的就用現成的,怎麼簡單怎麼來。搞一堆代碼維護起來也麻煩啊,現在qa行業跳槽也比較頻繁,萬一換了個人看不懂你的代碼怎麼辦?呵呵

閱讀全文

與curl命令要加埠嗎相關的資料

熱點內容
什麼app看電視不要錢的 瀏覽:14
烏班圖怎麼安裝c語言編譯器 瀏覽:277
plc通訊塊編程 瀏覽:922
我的世界伺服器怎麼清地皮 瀏覽:420
ftp伺服器如何批量改名 瀏覽:314
網易我的世界伺服器成員如何傳送 瀏覽:267
公司雲伺服器遠程訪問 瀏覽:632
法哲學pdf 瀏覽:637
清大閱讀app是什麼 瀏覽:446
怎麼用qq瀏覽器整體解壓文件 瀏覽:584
肺組織壓縮15 瀏覽:269
安卓手機為什麼換電話卡沒反應 瀏覽:797
諸子集成pdf 瀏覽:338
php注冊框代碼 瀏覽:716
手機加密好還是不加好好 瀏覽:815
別克凱越壓縮機泵頭多錢 瀏覽:241
組管理命令 瀏覽:980
海南高德司機端是什麼app 瀏覽:861
pid命令 瀏覽:888
一天一圖學會python可視化 瀏覽:309