【问题标题】:Send a complex data using curl in PHP在 PHP 中使用 curl 发送复杂数据
【发布时间】: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能做到,我们应该也能做到吧?

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

各位...

【问题讨论】:

标签: php json laravel curl multipartform-data


【解决方案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();

【讨论】:

  • 我一定会给它一个敲门,让你知道提前谢谢
猜你喜欢
  • 2010-11-08
  • 2015-01-28
  • 2020-09-26
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 2012-10-17
相关资源
最近更新 更多