Linux curl命令get/post提交數據、json和上傳文件全攻略

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-Typemultipart/form-data​,其餘全部POST的數據均可以從php://input流中讀得,如:POST的XML數據,二進制圖片數據。  

相關文章
相關標籤/搜索