ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

PHP的curl有三种请求数据的方式你需要知道raw、form-data、x-www-form-urlencoded

2021-10-19 12:34:48  阅读:300  来源: 互联网

标签:www HTTP form curl data CURLOPT


PHP提供的curl是非常常用的功能,估计很多小伙伴还没有研究透HTTP协议就可以傻瓜式的使用了,今天不会学习HTTP的知识,而是要分享一个关于curl开发的细节,就是HTTP请求头协议中的 Content-Type 字段在PHP的curl中的使用。我会在另一篇文章中分享HTTP协议相关知识。

 

我们在使用PHP进行开发过程中,会经常对接别人的接口,尤其是当下互联互通的大趋势下,使用curl的场景会更多,有些细节是需要特别注意的。

 

今天要讲的HTTP请求头的Content-Type字段,就是在curl发送请求的时候需要指定以何种方式来请求数据,按照postman的POST方法的分类,常用的有3类:

1、form-data 就是 multipart/form-data 使用表单的方式来发送数据 是curl采用的默认发送方式。

2、x-www-form-urlencoded 就是 application/x-www-form-urlencoded 把请求的内容转变成url参数的形式进行发送,如:s1=red&s2=blue,这是标准的编码格式,但在curl中却不是默认的发送方式。

3、raw(text/plain application/json text/xml等) 是以纯文本的方式发送数据,可以选择json、xml等格式

 

举个用postman以form-data发送的例子来说明:

 

 form-data的方式是以boundary为分隔符,表单中每个键值对字段是以Content-Disposition来分割。

 1 <?php
 2  
 3 $curl = curl_init();
 4  
 5 curl_setopt_array($curl, array(
 6   CURLOPT_URL => "http://www.baidu.com",
 7   CURLOPT_RETURNTRANSFER => true,
 8   CURLOPT_ENCODING => "",
 9   CURLOPT_MAXREDIRS => 10,
10   CURLOPT_TIMEOUT => 30,
11   CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
12   CURLOPT_CUSTOMREQUEST => "POST",
13   CURLOPT_POSTFIELDS => "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"s1\"\r\n\r\nred\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"s2\"\r\n\r\nblue\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--",
14   CURLOPT_HTTPHEADER => array(
15     "cache-control: no-cache",
16     "content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"
17   ),
18 ));
19  
20 $response = curl_exec($curl);
21 $err = curl_error($curl);
22  
23 curl_close($curl);
24  
25 if ($err) {
26   echo "cURL Error #:" . $err;
27 } else {
28   echo $response;
29 }

用postman以x-www-form-urlencoded发送的例子:

 

 PHP的curl默认是采用form-data方式,所以要把选项CURLOPT_POSTFIELDS的值用http_build_query()函数转化成URL-ENCODE的形式才会以application/x-www-form-urlencoded的方式进行请求。

 1 <?php
 2  
 3 $curl = curl_init();
 4  
 5 curl_setopt_array($curl, array(
 6   CURLOPT_URL => "http://www.baidu.com",
 7   CURLOPT_RETURNTRANSFER => true,
 8   CURLOPT_ENCODING => "",
 9   CURLOPT_MAXREDIRS => 10,
10   CURLOPT_TIMEOUT => 30,
11   CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
12   CURLOPT_CUSTOMREQUEST => "POST",
13   CURLOPT_POSTFIELDS => "s1=red&s2=blue&undefined=",
14   CURLOPT_HTTPHEADER => array(
15     "Content-Type: application/x-www-form-urlencoded",
16     "cache-control: no-cache"
17   ),
18 ));
19  
20 $response = curl_exec($curl);
21 $err = curl_error($curl);
22  
23 curl_close($curl);
24  
25 if ($err) {
26   echo "cURL Error #:" . $err;
27 } else {
28   echo $response;
29 }

另外再补充一下,form-data 是可以添加文件上传的,因为是按照提交表单的方式来发送数据的,所以PHP的curl默认采用这种方式,而x-www-form-urlencoded 是不可以上传文件的。

 

用postman以raw发送的例子:

 

 

 1 <?php
 2  
 3 $curl = curl_init();
 4  
 5 curl_setopt_array($curl, array(
 6   CURLOPT_URL => "http://www.baidu.com",
 7   CURLOPT_RETURNTRANSFER => true,
 8   CURLOPT_ENCODING => "",
 9   CURLOPT_MAXREDIRS => 10,
10   CURLOPT_TIMEOUT => 30,
11   CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
12   CURLOPT_CUSTOMREQUEST => "POST",
13   CURLOPT_POSTFIELDS => "{\"s1\":\"red\",\"s2\":\"blue\"}",
14   CURLOPT_HTTPHEADER => array(
15     "Content-Type: application/json",
16     "cache-control: no-cache"
17   ),
18 ));
19  
20 $response = curl_exec($curl);
21 $err = curl_error($curl);
22  
23 curl_close($curl);
24  
25 if ($err) {
26   echo "cURL Error #:" . $err;
27 } else {
28   echo $response;
29 }

所以,在使用PHP的curl进行远程请求数据的时候,不要盲目的使用,应该要注意选择何种请求的方式。

————————————————
版权声明:本文为CSDN博主「神男鲁班」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/leigin/article/details/89358126

标签:www,HTTP,form,curl,data,CURLOPT
来源: https://www.cnblogs.com/kaka0318/p/15424223.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有