Http協議支持:GET、HEAD、PUT、DELETE、POST、OPTIONS等6種請求方法;在這裏咱們經過linux curl命令,介紹其中的兩種請求方法:GET、POST;使用linux curl命令經過GET、POST命令提交數據、使用POST上傳文件,同時使用PHP語言介紹它們提交的數據和上傳的文件的接受方法。
php
1、測試前準備:
爲了測試方便,咱們在本站的站點根目錄下,寫了一個臨時接受數據腳本"test.php",用來接收提交上來的數據;全部的GET、POST請求都發送到「http://aiezu.com/test.php」,腳本的內容以下:html
1linux 2json 3後端 4服務器 5app 6curl 7測試 8url 9 10 11 12 13 14 15 16 17 18 19 |
<?php foreach ( array ( 'REQUEST_METHOD' , 'CONTENT_LENGTH' , 'CONTENT_TYPE' ) as $key ) { if ( isset( $_SERVER [ $key ] ) ) { echo sprintf( "[%s]: %s\n" , $key , $_SERVER [ $key ]); } } echo PHP_EOL; foreach ( array ( '_GET' , '_POST' , '_FILES' ) as $name ) { if ( ! empty ( $ $name ) ) { echo sprintf( "\$%s:\n" , $name ); print_r($ $name ); echo PHP_EOL; } } //接收JSON代碼 if ( strtolower ( $_SERVER [ 'CONTENT_TYPE' ]) == 'application/json' && $json = file_get_contents ( "php://input" ) ) { echo "JSON Data:\n" ; print_r(@json_decode( $json , true)); } |
2、GET請求方式:
GET方式只能提交key/value對數據,不能上傳二進制文件。使用linux curl命令經過GET方法提交數據主要分爲兩大類,1:直接將數據附加在URL後面;2:使用"-G"或者"--get"參數配合"-d"、"--data"、"--data-ascii"、"--data-urlencode"等參數,參數詳細介紹請參考:「Linux curl命令詳解」頁面中的「數據傳輸」組的介紹。
一、將數據直接附加在URL後面:
1 2 3 4 5 6 7 8 9 |
[root@aiezu.com ~] # curl 'http://aiezu.com/test.php?en=aiezu&cn=愛E族' [REQUEST_METHOD]: GET $_GET: Array ( [en] => aiezu [cn] => 愛E族 ) |
二、使用"-G"參數配合"-d"參數:
1 2 3 4 5 6 7 8 9 |
[root@aiezu tmp] # curl -G -d "en=aiezu&cn=愛E族" http://aiezu.com/test.php [REQUEST_METHOD]: GET $_GET: Array ( [en] => aiezu [cn] => 愛E族 ) |
因爲"-G"等價於"--get","-d"等價於"--data"、"--data-ascii",因此下面幾種方法和上面的方法是等價的:
1 2 3 4 |
curl -G --data "en=aiezu&cn=愛E族" http: //aiezu .com /test .php curl --get -d "en=aiezu&cn=愛E族" http: //aiezu .com /test .php curl --get --data "en=aiezu&cn=愛E族" http: //aiezu .com /test .php curl --get --data-ascii "en=aiezu&cn=愛E族" http: //aiezu .com /test .php |
三、帶特殊字符數據使用「--data-urlencode」:
1 2 3 4 5 6 7 8 9 |
[root@aiezu tmp] # curl --get --data-urlencode 'aa=&a' --data-urlencode '2=/&?' http://aiezu.com/test.php [REQUEST_METHOD]: GET $_GET: Array ( [aa] => &a [2] => /&? ) |
四、從文件中獲取數據:
1 2 3 4 5 6 7 8 9 10 11 |
[root@aiezu.com ~] # cat data.txt en=aiezu&cn=愛E族 [root@aiezu.com ~] # curl --get --data @data.txt http://aiezu.com/test.php [REQUEST_METHOD]: GET $_GET: Array ( [en] => aiezu [cn] => 愛E族 ) |
3、POST基本類型請求方式(-d):
基本的POST請求方式,只能提交key/value對數據,不能上二進制文件;參數詳細介紹請參考:「Linux curl命令詳解」頁面中的「數據傳輸」組的介紹。此方法的http請求頭大體以下:
1 2 3 4 5 6 |
POST /test.php HTTP/1.1 User-Agent: curl/7.29.0 Host: aiezu.com Accept: */* Content-Length: 19 Content-Type: application/x-www-form-urlencoded |
對、正是至關於html的以下表單:
1 2 3 |
< form method = "POST" action = "/test.php" enctype = "application/x-www-form-urlencoded" > ... </ form > |
一、直接設置POST數據:
1 2 3 4 5 6 7 8 9 10 11 12 |
[root@aiezu.com ~] # curl --data 'name=愛E族&site=aiezu.com' --data-urlencode 'code=/&?' http://aiezu.com/test.php [REQUEST_METHOD]: POST [CONTENT_LENGTH]: 42 [CONTENT_TYPE]: application /x-www-form-urlencoded $_POST: Array ( [name] => 愛E族 [site] => aiezu.com [code] => /&? ) |
二、從文件中獲取POST數據:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[root@aiezu.com ~] # cat data.txt en=aiezu&cn=愛E族 [root@aiezu.com ~] # curl --data @data.txt http://aiezu.com/test.php [REQUEST_METHOD]: POST [CONTENT_LENGTH]: 19 [CONTENT_TYPE]: application /x-www-form-urlencoded $_POST: Array ( [en] => aiezu [cn] => 愛E族 ) |
4、POST多類型表單數據請求方式(-F):
POST多類型表單數據請求方式支持提交key/value值對數據、和上傳二進制文件,是使用最多的一種方式。參數詳細介紹請參考:「Linux curl命令詳解」頁面中的「數據傳輸」組的介紹。此方法的http請求頭大體以下:
1 2 3 4 5 6 7 |
POST /test.php HTTP/1.1 User-Agent: curl/7.29.0 Host: aiezu.com Accept: */* Content-Length: 141 Expect: 100-continue Content-Type: multipart/form-data; boundary=----------------------------574307cce722 |
至關於HTML的以下表單:
1 2 3 |
< form method = "POST" action = "/test.php" enctype = "multipart/form-data" > ... </ form > |
注意:"-F"與"-d"有一點不一樣,"-d"可使用「-d 'a=1&b=2'」將兩個字段放一塊兒;而"-F"不行,一個"-F"只能包含一個key/value對,如:"-F a=1 -F b=2"。
一、提交key/value值對數據(--form、-F):
1 2 3 4 5 6 7 8 9 10 11 |
[root@aiezu.com ~] # curl --form 'name=愛E族' -F "site=aiezu.com" http://aiezu.com/test.php [REQUEST_METHOD]: POST [CONTENT_LENGTH]: 248 [CONTENT_TYPE]: multipart /form-data ; boundary=----------------------------71b11083beb3 $_POST: Array ( [name] => 愛E族 [site] => aiezu.com ) |
二、使用"@"、"<"失去特殊意義的"--form-string":
1 2 3 4 5 6 7 8 9 10 11 |
[root@aiezu.com ~] # curl --form-string 'str=@data.txt' --form-string "site=<b.txt" http://aiezu.com/test.php [REQUEST_METHOD]: POST [CONTENT_LENGTH]: 246 [CONTENT_TYPE]: multipart /form-data ; boundary=----------------------------c2250f4ad22a $_POST: Array ( [str] => @data.txt [site] => <b.txt ) |
三、從文件中獲取key/value對中的"value"("<"字符的特殊妙用):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[root@aiezu.com ~] # cat data.txt en=aiezu&cn=愛E族 [root@aiezu.com ~] # curl --form 'data=<data.txt' http://aiezu.com/test.php [REQUEST_METHOD]: POST [CONTENT_LENGTH]: 159 [CONTENT_TYPE]: multipart /form-data ; boundary=----------------------------575b8e666b57 $_POST: Array ( [data] => en=aiezu&cn=愛E族 ) |
5、POST上傳文件(-F "@"字符的妙用):
這裏仍是介紹第四步的「-F」參數,不過如今是介紹它的上傳文件;
一、自動識別文件類型:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[root@aiezu.com ~] # curl --form 'file=@data.txt' http://aiezu.com/test.php [REQUEST_METHOD]: POST [CONTENT_LENGTH]: 206 [CONTENT_TYPE]: multipart /form-data ; boundary=----------------------------126831d4cffa $_FILES: Array ( [ file ] => Array ( [name] => data.txt [ type ] => text /plain [tmp_name] => /tmp/php6HqQjx [error] => 0 [ size ] => 20 ) ) |
二、告訴http服務器後端腳本,這是一張圖片,不是一個文本文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<span>[root@aiezu.com ~] # curl -F "pic=@data.txt;filename=image.jpg;type=image/jpeg" http://aiezu.com/test.php [REQUEST_METHOD]: POST [CONTENT_LENGTH]: 206 [CONTENT_TYPE]: multipart /form-data ; boundary=----------------------------45fce8b3a421 $_FILES: Array ( [pic] => Array ( [name] => image.jpg [ type ] => image /jpeg [tmp_name] => /tmp/phpvWcwiX [error] => 0 [ size ] => 20 ) ) |
6、POST提交JSON數據:
下面代碼爲linux curl命令POST方式提交JSON數據的方法、已經使用PHP語言的接收代碼:
1 2 3 4 5 6 7 8 9 10 11 |
[root@aiezu.com ~] # curl -H "Content-Type: application/json" --data '{"name":"愛E族","site":"aiezu.com"}' http://aiezu.com/test.php [REQUEST_METHOD]: POST [CONTENT_LENGTH]: 37 [CONTENT_TYPE]: application /json JSON Data: Array ( [name] => 愛E族 [site] => aiezu.com ) |
接收JSON的代碼段:
1 2 3 4 5 |
<?php if ( strtolower ( $_SERVER [ 'CONTENT_TYPE' ]) == 'application/json' && $json = file_get_contents ( "php://input" ) ) { echo "JSON Data:\n" ; print_r(@json_decode( $json , true)); } |
提示:除了Content-Type爲multipart/form-data,其餘全部POST的數據均可以從php://input流中讀得,如:POST的XML數據,二進制圖片數據。