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

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来分割。

<?php

$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 => "------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--",
  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发送的例子:

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

<?php

$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发送的例子:

<?php

$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进行远程请求数据的时候,不要盲目的使用,应该要注意选择何种请求的方式。

 

 

 

<think>好的,用户想了解curl命令中的-d参数用法,并且需要给出示例。首先,我需要回忆一下自己关于curl的知识,特别是-d参数的相关内容。 记得-d参数是用来发送POST请求中的数据的,通常与Content-Type: application/x-www-form-urlencoded相关联。用户可能是在尝试向服务器提交表单数据或者API请求时需要用到这个参数。 接下来,我需要确认是否正确理解了-d的功能。比如,使用-d时,数据会被放在请求体中,并且curl会自动将请求方法设置为POST,除非另外指定。但根据引用[1],curl默认使用GET,所以可能需要确认是否使用-d会自动改变方法。不过根据经验,使用-d确实会导致curl使用POST方法,所以可能引用中的信息需要再核对。不过引用[1]提到使用-X可以指定动词,比如POST或DELETE,所以当用户同时使用-d和-X参数时,需要明确方法。 然后,需要举几个例子。例如,最基本的用法是curl -d "key=value" URL,这样会发送POST请求。如果需要发送多个字段,可以用多个-d参数或者用&连接,如-d "name=John&age=30"。此外,用户可能需要发送JSON数据,这时候需要设置Content-Type,例如加上-H "Content-Type: application/json"然后用-d传递JSON字符串。 还要注意,当从文件读取数据时,可以使用@filename的形式,比如-d @data.json。同时,用户可能想知道-d和--data-raw的区别,或者与-F参数的区别,但用户的问题主要集中在-d,所以可能需要简要提及这些区别,但主要回答-d的用法。 另外,根据引用[2],用户代理可以设置,但和-d无关。引用[3]提到curl支持多种协议,所以需要确保示例覆盖常见的用例,比如HTTP POST。 最后,需要检查是否有错误,比如语法是否正确,示例是否可行,同时确保按照用户的要求使用正确的格式,比如行内公式用$...$,但这个问题中可能不涉及数学公式,但需要遵守其他格式要求,如代码块用反引号,引用标识等。</think>### curl命令中-d参数详解 `curl -d`参数用于发送HTTP POST请求的表单数据(默认Content-Type为`application/x-www-form-urlencoded`),常用于API调用或表单提交。 #### 基础用法 1. **发送单个字段** ```bash curl -d "name=John" http://example.com/api ``` 此命令会向目标URL发送POST请求数据体为`name=John`。 2. **发送多个字段** ```bash curl -d "name=John" -d "age=30" http://example.com/api ``` 或合并为单参数: ```bash curl -d "name=John&age=30" http://example.com/api ``` 3. **发送JSON数据** 需手动设置`Content-Type`部: ```bash curl -d '{"name":"John","age":30}' -H "Content-Type: application/json" http://example.com/api ``` #### 进阶用法 1. **从文件读取数据** 使用`@`符号加载文件内容: ```bash curl -d @data.txt http://example.com/api ``` 2. **结合其他HTTP方法** `-d`默认触发POST请求,但可通过`-X`指定其他方法: ```bash curl -X PUT -d "key=value" http://example.com/api ``` 3. **调试与查看请求详情** 添加`-v`参数显示请求与响应: ```bash curl -v -d "test=1" http://example.com/api ``` #### 注意事项 - `-d`与`-F`的区别:`-F`用于`multipart/form-data`(文件上传),而`-d`用于普通表单或JSON数据[^1][^3]。 - 数据编码:若字段含特殊字符(如空格),需进行URL编码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值