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

本文深入探讨了PHP中cURL的使用细节,重点讲解了Content-Type字段在不同请求类型(form-data、x-www-form-urlencoded、raw)中的应用,以及如何在PHP中正确设置这些类型,以实现数据的有效传输。

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>好的,我现在需要帮助用户解决如何将Charles抓到的内容文本一键复制到Postman的form-data表单里。首先,我应该回顾用户之前的提问历史。用户之前询问过如何一键复制数据到Postman表单,得到了几种方法,包括使用form-data的批量编辑、JSON/XML导入、cURL转换以及预请求脚本。现在用户具体问的是从Charles抓到的contents文本信息如何操作。 用户可能已经使用Charles抓包工具捕获到了HTTP请求的内容,可能是form-data格式或者其他格式。用户希望快速将这些内容复制到Postman的form-data中,而不用手动逐个输入。这可能涉及到如何正确解析Charles中的内容,并确保Postman能够正确识别这些数据。 首先,我需要考虑Charles中抓取的数据通常是什么样的。比如,在Charles的Contents标签下,用户可能会看到请求的body部分,如果是form-data,可能会显示为键值对,或者如果是其他格式如JSON,可能需要不同的处理方式。用户可能复制的是原始文本,需要正确的格式转换。 然后,回顾之前的回答中提到的几种方法,特别是使用form-data的Bulk Edit功能,或者使用cURL导入。这两种方法可能适用。但用户现在的情况可能更具体,比如直接从Charles复制的内容可能不是cURL命令,而是form-data的键值对,或者是其他格式。 可能的步骤包括: 1. 从Charles复制form-data的键值对,如key1=value1&key2=value2这样的格式。 2. 在Postman中使用Bulk Edit粘贴,然后自动解析成键值对。 3. 或者如果数据是其他格式,比如JSON,可能需要转换为form-data,或者使用不同的方法。 另外,用户可能遇到的情况是,Charles中的Contents显示的是编码后的数据,比如URL编码,或者multipart/form-data的原始数据,这时候需要正确解析。例如,如果用户直接复制的是类似于“username=test%40user&password=12345”这样的字符串,可能需要先进行URL解码,然后再分割成键值对。 还需要考虑用户可能遇到的问题,例如特殊字符未正确处理,或者格式不正确导致Postman无法解析。这时候需要指导用户如何检查和处理这些问题,比如使用URL解码,或者调整格式。 另外,之前的回答中提到的预请求脚本可能也是一个解决方案,但可能对于普通用户来说比较复杂,所以可能需要优先推荐更简单的方法,如Bulk Edit或cURL导入,如果适用的话。 最后,用户可能需要的是明确的步骤,针对Charles中抓取的内容的具体情况,例如如何从Charles中找到正确的数据部分,如何复制,然后在Postman中如何操作。因此,回答需要分步骤,结构清晰,并且针对不同的数据格式给出不同的处理方法。</think>以下是将Charles抓包获取的`Contents`数据快速迁移到Postman表单的详细操作流程: ------------- ### 一、**基础场景:原始键值对直接迁移** #### 适用于`application/x-www-form-urlencoded`格式数据 **操作步骤:** 1. **Charles提取数据** ```plaintext ① 选中目标请求 → 打开`Contents`标签页 ② 在`Form`子标签中直接看到解码后的键值对 ``` 2. **Postman批量粘贴** ```plaintext ① 新建POST请求 → 选择Body → form-data ② 点击右上角`Bulk Edit`按钮 ③ 直接粘贴原始键值对(示例格式): username=test@demo password=Abc_123 remember_me=true ④ 点击`Key-Value Edit`自动生成表单字段 ``` ------------- ### 二、**进阶场景:处理编码后的原始数据** #### 适用于`Raw`标签中的未解码数据(如`%40`等特殊符号) **操作步骤:** 1. **Charles复制原始字符串** ```plaintext ① 在`Contents` → `Text`标签复制原始数据: username=test%40demo&password=Abc%5F123 ``` 2. **Postman自动解码** ```plaintext ① 按基础场景步骤打开Bulk Edit ② 直接粘贴编码字符串: username=test%40demo password=Abc%5F123 ③ Postman会自动进行URL解码 → username=test@demo → password=Abc_123 ``` ------------- ### 三、**高阶场景:处理二进制文件上传** #### 适用于包含文件上传的`multipart/form-data` **操作步骤:** 1. **Charles定位文件参数** ```plaintext ① 在`Contents` → `Form`标签找到文件字段: file=<文件名.jpg> (显示为二进制数据) ``` 2. **Postman还原上传流程** ```plaintext ① 在form-data表单中创建同名文件字段 ② 点击`File`模式 → 选择本地对应文件 ③ 通过Charles抓包确认Content-Type ``` ------------- ### 四、**终极方案:cURL命令直接转换** #### 适用于复杂请求(含Headers/Cookies) **操作步骤:** 1. **Charles生成cURL** ```plaintext ① 右键目标请求 → Copy → cURL Command ``` 2. **Postman一键导入** ```plaintext ① 点击左上角`Import` → 粘贴cURL命令 ② 自动生成完整请求配置: - URL - Headers - Cookies - Form-data参数 ``` ------------- ### 五、**调试技巧** ```plaintext 1. 数据对比验证: - 在Postman发送请求后,用Charles抓包对比原始请求与Postman请求的二进制数据 2. 边界符异常处理: - 若出现`boundary`不匹配错误,在Headers中删除`Content-Type`让Postman自动生成 ``` > 通过上述方法可覆盖99%的Charles数据迁移场景。重点注意:当原始请求包含`Content-Type: multipart/form-data`时,建议优先使用cURL导入方案避免手动配置错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值