Symfony 1.4.2在PHP cURL PUT请求中没有内容


Symfony 1.4.2 no content in PHP cURL PUT request

使用PHP cURL和Symfony 1.4.2

我正在尝试做一个PUT请求,包括数据(JSON)来修改我的REST web服务中的对象,但无法捕获服务器端的数据。

当检查我的日志时,似乎内容已成功附加:

PUT to http://localhost:8080/apiapp_test.php/v1/reports/498 with post body content=%7B%22report%22%3A%7B%22title%22%3A%22The+title+has+been+updated%22%7D%7D

我像这样附上数据:

$curl_opts = array(
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POSTFIELDS => http_build_query(array('content' => $post_data)),
);

然后想用这样的方式获取数据

$payload = $request->getPostParameter('content');

它不工作,我已经尝试了很多方法来获得这个数据在我的动作文件。我尝试了以下解决方案:

parse_str(file_get_contents("php://input"), $post_vars);
$payload = $post_vars['content'];
// or
$data = $request->getContent(); // $request => sfWebRequest
$payload = $data['content'];
// or
$payload = $request->getPostParameter('content');
// then I'd like to do that
$json_array = json_decode($payload, true);

我只是不知道如何在我的行动中得到这些数据,这很令人沮丧,我在这里读了很多关于它的话题,但没有一个适合我。

额外的信息:

我的cURL请求设置如下:

curl_setopt($curl_request, CURLOPT_CUSTOMREQUEST, $http_method);
if ($http_method === sfRequest::PUT) {
    curl_setopt($curl_request, CURLOPT_PUT, true);
    $content_length = array_key_exists(CURLOPT_POSTFIELDS, $curl_options) ? strlen($curl_options[CURLOPT_POSTFIELDS]) : 0;
    $curl_options[CURLOPT_HTTPHEADER][] = 'Content-Length: ' . $content_length;
}
curl_setopt($curl_request, CURLOPT_URL, $url);
curl_setopt($curl_request, CURLOPT_CONNECTTIMEOUT, 4);
curl_setopt($curl_request, CURLOPT_TIMEOUT, 4);
curl_setopt($curl_request, CURLOPT_DNS_CACHE_TIMEOUT, 0);
curl_setopt($curl_request, CURLOPT_NOSIGNAL, true);
curl_setopt($curl_request, CURLOPT_RETURNTRANSFER, true);

在sfWebRequest.php中,我看到了这个:

case 'PUT':
  $this->setMethod(self::PUT);
  if ('application/x-www-form-urlencoded' === $this->getContentType())
  {
    parse_str($this->getContent(), $postParameters);
  }
  break;

所以我试着设置标题的Content-Type为它但是它没有做任何事情

如果你有任何想法,请帮助!

根据另一个问题/答案,我已经测试了这个解决方案,我得到了正确的结果:

$body = 'the RAW data string I want to send';
/** use a max of 256KB of RAM before going to disk */
$fp = fopen('php://temp/maxmemory:256000', 'w');
if (!$fp) {
    die('could not open temp memory data');
}
fwrite($fp, $body);
fseek($fp, 0);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_PUT, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_INFILE, $fp); // file pointer
curl_setopt($ch, CURLOPT_INFILESIZE, strlen($body));
$output = curl_exec($ch);
echo $output;
die();

在另一边,您可以使用:

检索内容
$content = $request->getContent();

如果您var_dump它,您将检索到:

我想发送的RAW数据字符串