php - 如何使用 PHP 发送带有文件和数据数组的 PUT 请求

标签 php rest curl put

我已经在 PHP 中设置了 REST 服务和客户端,但在使用 PUT 时遇到了一些问题。

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

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

最佳答案

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

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

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

关于php - 如何使用 PHP 发送带有文件和数据数组的 PUT 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5475296/

相关文章:

rest - 为什么 GorillaMux 不允许我将 URL 作为参数传递?

php - 带有 PHP CURL 的 SSL 证书

php - 我有一个 php 代码,可以获取数据库中的数据并显示。现在,我希望它以pdf格式显示

php - 在 php 中使用相同的表单插入和编辑数据

java - Rest 客户端通过 https 与服务器通信

java - REST API 与 Hadoop 冲突

php - YouTube API v2.0 - OAuth 2.0授权

c# - 使用 asp.net mvc 应用程序的 HttpClient post 请求 WebApi

php - HighCharts Basic 线不显示线

php - 如何将带有CSS的模板包含到网站上的所有页面