php curl from-data,PHP的curl有三种请求数据的方式你需要知道raw、form-data、x-www-form-urlencoded-Go语言中文社区...

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发送的例子来说明:

219f55335a7cd7b9bc97b392adc25c53.png

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

$curl = curl_init();

curl_setopt_array($curl, array(

CURLOPT_URL => "http://www.baidu.com",

CURLOPT_RETURNTRANSFER => true,

CURLOPT_ENCODING => "",

CURLOPT_MAXREDIRS => 10,

CURLOPT_TIMEOUT => 30,

CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,

CURLOPT_CUSTOMREQUEST => "POST",

CURLOPT_POSTFIELDS => "------WebKitFormBoundary7MA4YWxkTrZu0gWrnContent-Disposition: form-data; name="s1"rnrnredrn------WebKitFormBoundary7MA4YWxkTrZu0gWrnContent-Disposition: form-data; name="s2"rnrnbluern------WebKitFormBoundary7MA4YWxkTrZu0gW--",

CURLOPT_HTTPHEADER => array(

"cache-control: no-cache",

"content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"

),

));

$response = curl_exec($curl);

$err = curl_error($curl);

curl_close($curl);

if ($err) {

echo "cURL Error #:" . $err;

} else {

echo $response;

}

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

2037b706fa85a7afe02e84fa4c9382e5.png

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

$curl = curl_init();

curl_setopt_array($curl, array(

CURLOPT_URL => "http://www.baidu.com",

CURLOPT_RETURNTRANSFER => true,

CURLOPT_ENCODING => "",

CURLOPT_MAXREDIRS => 10,

CURLOPT_TIMEOUT => 30,

CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,

CURLOPT_CUSTOMREQUEST => "POST",

CURLOPT_POSTFIELDS => "s1=red&s2=blue&undefined=",

CURLOPT_HTTPHEADER => array(

"Content-Type: application/x-www-form-urlencoded",

"cache-control: no-cache"

),

));

$response = curl_exec($curl);

$err = curl_error($curl);

curl_close($curl);

if ($err) {

echo "cURL Error #:" . $err;

} else {

echo $response;

}

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

用postman以raw发送的例子:

b0a1c444958023b17fa8acdfbb0d5066.png

$curl = curl_init();

curl_setopt_array($curl, array(

CURLOPT_URL => "http://www.baidu.com",

CURLOPT_RETURNTRANSFER => true,

CURLOPT_ENCODING => "",

CURLOPT_MAXREDIRS => 10,

CURLOPT_TIMEOUT => 30,

CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,

CURLOPT_CUSTOMREQUEST => "POST",

CURLOPT_POSTFIELDS => "{"s1":"red","s2":"blue"}",

CURLOPT_HTTPHEADER => array(

"Content-Type: application/json",

"cache-control: no-cache"

),

));

$response = curl_exec($curl);

$err = curl_error($curl);

curl_close($curl);

if ($err) {

echo "cURL Error #:" . $err;

} else {

echo $response;

}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值