在 PHP 中使用 curl 发送复杂数据

Posted

技术标签:

【中文标题】在 PHP 中使用 curl 发送复杂数据【英文标题】:Send a complex data using curl in PHP 【发布时间】:2021-04-30 08:54:50 【问题描述】:

我搜索了很多,找到了很多与此相关的问题和论坛,但是这个是一个具有挑战性的。

我正在尝试通过curl 发布一个复杂的数组。它必须是form-data,而数组中的第一个值是JSON 类型。 array 的另外两个值是两个已上传并准备发送的图像。

我尝试在Postman 中运行它,并且运行良好。我使用了Postman 生成的php 代码,但它不起作用。似乎邮递员正在处理它的一些技巧而不向我们透露它们。

无论如何,我发布一张邮递员图片来说明我的意思:

如您所见,我在form-data 选项卡中发送数据,我的第一个值(param1)是JSONcontent-typeapplication/json,第二个和第三个值是上传的图像Postman.

这在Postman 中工作得很好。

问题是,如果我在标头中设置Content-Type:multipart/form-data,目标服务器会抛出一个错误,指出content-type 必须是JSON

如果我在标头中设置Content-Type:application/json,目标服务器会说内容必须是 Multipart 类型。

不知何故,我需要设置两种内容类型。主要的 form-data 和 param1 的 JSON

我也粘贴了 Postman 代码,这可能是你们帮助编写代码的一个好的开始。

邮递员代码:


$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'http://xxxxx.com/xxxx/xxx/xxxx',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS => array('param1' => '
   "AgentId":"1414",
   "ContractId":36529,
   "Files":[
      
         "FileName":"car_card_front_image.png",
         "FileTypeId":2
      ,
      
         "FileName":"car_card_back_image.png",
         "FileTypeId":2
      
   ]
','param2'=> new CURLFILE('/C:/images/icons/car_card_back_image.png'),'param3'=> new CURLFILE('/C:/images/icons/car_card_front_image.png')),
  CURLOPT_HTTPHEADER => array(
    'authenticationToken: xxxx-xxx-xx-xxxxxxxx'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

邮递员生成的 PHP 代码,不工作。原因之一可能是其中没有提到内容类型。

我尝试修改代码,在标题和参数中添加内容类型,似乎没有任何效果。

如果Postman能做到,我们应该也能做到吧?

继续,尽可能多地进行更改,或者提出任何你想到的建议,我会全部测试。

各位...

【问题讨论】:

这能回答你的问题吗? ***.com/questions/3433542/curl-php-send-image 很遗憾,不再支持禁用安全上传 【参考方案1】:

我可以推荐ixudrra/curl 库吗?

这会让你的生活更轻松......

$response = Curl::to('http://example.org')
        ->withData( array( 'Foo' => 'Bar' ) )
        ->withFile( 'image_1', '/path/to/dir/image1.png', 'image/png', 'imageName1.png' )
        ->withFile( 'image_2', '/path/to/dir/image2.png', 'image/png', 'imageName2.png' )
        ->post();

【讨论】:

我一定会给它一个敲门,让你知道提前谢谢

以上是关于在 PHP 中使用 curl 发送复杂数据的主要内容,如果未能解决你的问题,请参考以下文章

curl实现发送Get和Post请求(PHP)

如何通过 cURL/PHP 使用 PUT 方法将 JSON 数据发送到 API

PHP中使用CURL

php 中使用cURL发送get/post请求,上传图片,批处理

php 中使用cURL发送get/post请求,上传图片,批处理

php的curl模拟post发送数据,部分丢失