您的位置:首页 > 理论基础 > 计算机网络

HTTP协议理解 + PHP使用curl函数发送Post请求的注意事项

2017-10-10 18:38 1006 查看

HTTP协议理解

Content-Type:指定请求和响应的HTTP内容类型,默认为text/html。

下面是几个常见的Content-Type:

1. text/html

2. text/plain

3. text/css

4. text/javascript

5. application/x-www-form-urlencoded

6. multipart/form-data

7. application/json

8. application/xml

前面四个是html,css,javascript的文件类型,后面四个是POST的发包方式。

application/x-www-form-urlencoded是常用的表单发包方式,普通的表单提交,或者js发包,默认都是通过这种方式,

比如一个简单地表单:

<form enctype="application/x-www-form-urlencoded" action="http://homeway.me/post.php" method="POST">
<input type="text" name="name" value="homeway">
<input type="text" name="key" value="nokey">
<input type="submit" value="submit">
</form>


那么服务器收到的raw header会类似:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,gl;q=0.2,de;q=0.2
Cache-Control:no-cache
Connection:keep-alive
Content-Length:17
Content-Type:application/x-www-form-urlencoded


那么服务器收到的raw body会是,name=homeway&key=nokey,在php中,通过$_POST就可以获得数组形式的数据。

multipart/form-data用在发送文件的POST包。

这里假设我用python的request发送一个文件给服务器:

data = {

“key1”: “123”,

“key2”: “456”,

}

files = {‘file’: open(‘index.py’, ‘rb’)}

res = requests.post(url=”http://localhost/upload”, method=”POST”, data=data, files=files)

print res

通过工具,可以看到我发送的数据内容如下:

POST http://www.homeway.me HTTP/1.1

Content-Type:multipart/form-data; boundary=——WebKitFormBoundaryOGkWPJsSaJCPWjZP

——WebKitFormBoundaryOGkWPJsSaJCPWjZP

Content-Disposition: form-data; name=”key2”

456

——WebKitFormBoundaryOGkWPJsSaJCPWjZP

Content-Disposition: form-data; name=”key1”

123

——WebKitFormBoundaryOGkWPJsSaJCPWjZP

Content-Disposition: form-data; name=”file”; filename=”index.py”

这里Content-Type告诉我们,发包是以multipart/form-data格式来传输,另外,还有boundary用于分割数据。

当文件太长,HTTP无法在一个包之内发送完毕,就需要分割数据,分割成一个一个chunk发送给服务端,

那么–用于区分数据快,而后面的数据633e61ebf351484f9124d63ce76d8469就是标示区分包作用。

参考链接:https://segmentfault.com/a/1190000003002851

php中的curl()函数进行post请求的时候,传递数据的格式可以有以下几种方式:

1、由参数拼接而成的key=>value键值对字符串。形如以下:
name=xxx&age=23$sex=1
,这种请求参数默认是按照application/x-www-form-urlencoded进行编码的。

2、由参数组成的key=>value键值对数组(只能是一维数组,更高维度的数组会报错)。

形如以下格式,这种请求参数默认是按照multipart/form-data格式进行编码的。

[ name="xxx" , age = 23 , sex = 男 ]


3、将多维数组进行http_build_query()进行处理,等到一个key=>value键值对格式的字符串。

如下,这种方式也是通过application/x-www-form-urlencoded进行编码的,在接收方可以通过$_POST直接获取。

$data = [
"msg"=>"这是一条测试数据",
"xxx" => "yyyy",
"msg_data" => [
"name"=>"sunms",
"age"=>23,
"sex"=>"男",
"content"=>[
1,2,3
]
],
];


将得到以下的字符串:

msg=这是一条测试数据&xxx=yyyy&msg_data[name]=sunms&msg_data[age]=23&msg_data[sex]=男&msg_data[content][0]=1&msg_data[content][1]=2&msg_data[content][2]=3


4、将多维数组转换为json格式的字符串,对字符串进行application/json格式编码,在接收方通过file_get_contents(“php://input”)或者$GLOBALS[‘HTTP_RAW_POST_DATA’]的方式获取传递过来的json格式的字符串,然后将json格式的字符串转换为数组进行处理。

$data = [];
$data_string = json_encode($data);
.....
//设置header信息
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Content-Length: ' . strlen($data_string))
);


注意:对于application/json格式编码的数据,POST是不能直接获取的,需要通过filegetcontents(“php://input”)或者GLOBALS[‘HTTP_RAW_POST_DATA’]的方式获取。

参考文档: http://www.jb51.net/article/98335.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  curl php http协议