Http协议支持:获取、头部、上传、删除、开机自检、选项6种请求方法; 下面通过linux curl命令介绍其中的两种请求方法。 获取、开机自检; 使用linux curl命令,通过GET、POST命令发送数据,通过POST上传文件。 它还说明如何使用PHP语言接收发送的数据和上传的文件。
一、测试前准备:为了方便测试,我们在本站的网站渠道下编写了一个临时接收数据以接收提交数据的脚本“test.php”; 所有GET、POST请求都发送到“http://aiezu.com/test.php”,脚本内容如下: php
foreach (阵列) request_method )、) CONTENT_LENGTH )、) CONTENT_TYPE ) ) as $key ) {
if(isset($_server ) $key ) ) }{
Echosprintf([%s]:%sn )、$key、$_SERVER[$key] );
}
}
echo PHP_EOL;
Foreach(Array('_get ',' _POST ',' _FILES ' ) as $name ) {
if (! empty($$name ) ) }
Echosprintf (() $%s:(n )、$name );
print_r($$name;
echo PHP_EOL;
}
}
接收JSON代码
if (strtolower ($ _ server [ ' content _ type ' ] )==' application/JSON ' $ JSON=file _ get _ contents ) ) PHP3333
echo 'JSON Data:n ';
print_r(@JSON_decode ) $JSON,true );
}
二、GET请求方式: GET方式只能提交key/value对数据,不能上传二进制文件。 要使用linux curl命令通过GET方法发送数据,主要分为两类。 一种是直接将数据附加到URL。 2 :使用“- g”或“--get”参数匹配“-d”、“--data”、“--data-ascii”和“--data-urlencode”等参数有关参数的详细信息,请参见Linux curl
1、在网址后直接附加数据。 [ root @ aie zu.com~] # curl ' http://aie zu.com/test.PHP? en=aiezucn=爱e族'
[REQUEST_METHOD]: GET
$_GET :
阿拉伊
(
[en]=aiezu
[cn]=爱家人
)
2、使用'-G '参数匹配'-d '参数: [ root @ aiezutmp ] # curl-g-d ' en=aiezucn=爱e族' http://aie zu.com/test .
[REQUEST_METHOD]: GET
$_GET :
阿拉伊
(
[en]=aiezu
[cn]=爱家人
(-G )与(--get )、(-d )与(--data )、(--data-ascii )等价,因此以下几种方法与上述方法等价. curl-g----data ) en=aiezucn=
curl --get -d 'en=aiezucn=爱e族' http://aiezu.com/test.php
CURL----get----data'en=Aiezucn=爱e族' http://aiezu.com/test.php
curl---- get---- data-ascii ' en=aiezucn=爱e族' http://aiezu.com/test.php
3、带特殊字符的数据使用“----data-urlencode”。 [ root @ aiezutmp ] # curl---get---- data-urlencode ' aa=a '-- data-urlencode ' http://aie zu.com/test.phh
[REQUEST_METHOD]: GET
$_GET :
阿拉伊
(
[aa]=a
[2]=/?
)
4、从文件中获取数据: [root@aiezu.com ~]# cat data.txt
en=aiezucn=爱e族
[root@aiezu.com ~]# curl --get --data @data.txt http://aiezu.com/test.php
[REQUEST_METHOD]: GET
$_GET:
Array
(
[en] => aiezu
[cn] => 爱E族
)
三、POST基本类型请求方式(-d): 基本的POST请求方式,只能提交key/value对数据,不能上二进制文件;参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。此方法的http请求头大致如下: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、直接设置POST数据:[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] => /&?
)
2、从文件中获取POST数据:[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族
)
四、POST多类型表单数据请求方式(-F): POST多类型表单数据请求方式支持提交key/value值对数据、和上传二进制文件,是使用最多的一种方式。参数详细介绍请参考:“Linux curl命令详解”页面中的“数据传输”组的介绍。此方法的http请求头大致如下: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的如下表单:
...
注意:"-F"与"-d"有一点不同,"-d"可以使用“-d 'a=1&b=2'”将两个字段放一起;而"-F"不行,一个"-F"只能包含一个key/value对,如:"-F a=1 -F b=2"。1、提交key/value值对数据(--form、-F):[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
)
2、使用"@"、"
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 246
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------c2250f4ad22a
$_POST:
Array
(
[str] => @data.txt
[site] =>
)
3、从文件中获取key/value对中的"value"("
en=aiezu&cn=爱E族
[root@aiezu.com ~]# curl --form 'data=
[REQUEST_METHOD]: POST
[CONTENT_LENGTH]: 159
[CONTENT_TYPE]: multipart/form-data; boundary=----------------------------575b8e666b57
$_POST:
Array
(
[data] => en=aiezu&cn=爱E族
)
五、POST上传文件(-F "@"字符的妙用): 这里还是介绍第四步的“-F”参数,不过现在是介绍它的上传文件;
1、自动识别文件类型:[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
)
)
2、告诉http服务器后端脚本,这是一张图片,不是一个文本文件:[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
)
)
六、POST提交JSON数据: 下面代码为linux curl命令POST方式提交JSON数据的方法、已经使用PHP语言的接收代码:[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的代码段:<?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数据,二进制图片数据。
七、附录:参考页面: