【问题标题】:How to send a PUT request with a file and an array of data with PHP如何使用 PHP 发送带有文件和数据数组的 PUT 请求
【发布时间】:2023-03-26 06:04:02
【问题描述】:

我在 PHP 中设置了一个 REST 服务和客户端,但我在使用 PUT 时遇到了一些麻烦。

这是我的情况: 我正在编写一个应该接受数据数组和图像的 REST 资源。 REST 资源应该更新现有记录,所以我使用 PUT。我正在使用我编写的 PHP curl 客户端发送数据。所以 - 几乎与您将 HTML 多部分表单发送到执行文件上传并接受一些额外 POST 字段的 PHP 脚本相同的情况 - 除了 PUT 和 PHP curl..

到目前为止,我一直在发送类似这样的 PUT 请求(伪代码):

$a_some_data = array('name' => 'test', 'user_id' => 4);
$body = http_build_query($a_data);

$fh = fopen('php://memory', 'rw');
fwrite($body);
rewind($fh);

$ch = curl_init();
curl_setopt_array($ch, array(
  CURLOPT_URL => 'http://myapi/resource/someid',
  CURLOPT_PUT => TRUE,
  CURLOPT_INFILE => $fh,
  CURLOPT_INFILESIZE => strlen($body)
  ));
curl_exec($ch);

并像这样读取服务器上的数据:

parse_str(file_get_contents('php://input'), $put_data);

..效果很好。

所以现在我想在混合中添加一个(二进制)文件。 - 我将如何在客户端实现这一点? - 我将如何处理服务器上的文件?

对于测试,我设置了一个带有文件输入的 HTML 表单,复制了它发送的原始 multipart/form-data 请求,并尝试在 PUT 请求中将该数据作为带有 curl 的文件发送。这种工作,但我必须手动解析服务器上的原始数据,我不确定这是最好的主意。或者,我想我可以将文件作为 PUT 请求的主体发送,并将 URL 中的其他参数作为查询字符串添加 - 但我想这违背了 PUT REST 资源的意义..

请分享您对此的看法。 谢谢!

【问题讨论】:

    标签: php rest curl put


    【解决方案1】:

    除非您的原始版本不够用,否则至少还有两种其他方法(因为 libcurl 也可以使用该脚本处理二进制文件)。请注意,您如何决定在接收端接收 PUT 不是 curl 问题,因此我将把它排除在此响应之外。

    1 - 就像您刚开始时一样,但提供一个 CURLOPT_READFUNCTION,您可以使用该 CURLOPT_READFUNCTION 将数据提供给它将发送的 libcurl。

    2 - 使用 CURLOPT_POSTFIELDS(带有字符串)并使其看起来像 POST,然后将带有 CURLOPT_CUSTOMREQUEST 的 HTTP 方法更改为“PUT”

    【讨论】:

    • 谢谢丹尼尔。我喜欢第二个版本,它看起来像要走的路 - 因为请求仍然作为 PUT 发送,但包含多部分内容。现在,我在 php://input 中获取的服务器上的数据几乎就是我使用 HTML 表单发送所有内容时得到的数据。你知道解析这个的最好方法是什么吗?有没有一种很好的方法可以从这些原始数据中提取数据和文件,还是我必须手动解析它?
    猜你喜欢
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多