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
相关文章推荐
- PHP使用curl函数发送Post请求的注意事项
- PHP使用curl函数发送Post请求的注意事项
- PHP使用curl函数发送Post请求的注意事项
- php 用 curl函数发送post请求
- PHP中使用CURL发送get/post请求上传图片批处理功能
- PHP模拟发送POST请求之五curl基本使用和多线程优化
- php 中使用cURL发送get/post请求,上传图片,批处理
- PHP中使用cURL发送http/https请求
- php 中使用cURL发送get/post请求,上传图片,批处理
- php 中使用cURL发送get/post请求,上传图片,批处理
- PHP中的使用curl发送请求(GET请求和POST请求)
- php使用fsockopen函数发送post,get请求获取网页内容的方法
- 使用Fiddler发送http post请求的注意点
- php 中使用cURL发送get/post请求,上传图片,批处理
- PHP模拟发送POST请求之五curl基本使用和多线程优化
- php 通过CURL 发送Http的post请求
- PHP-CURL在POST请求时的注意事项
- php使用fsockopen函数发送post,get请求获取网页内容的方法
- PHP中使用CURL模拟发送GET,POST,PUT,DELETE请求
- 请使用socket相关函数(非curl)实现如下功能:构造一个post请求,发送到指定httpserver的指定端口的指定请求路径(如http://www.example.com:8080/test)