cURL实际上并没有发送POST数据

时间:2014-09-19 02:38:04

标签: php post curl

概述
我有一个脚本,我们称之为one.php,它创建了一个数据库和表。它还包含要发布到另一个脚本two.php的数据数组,该脚本将对数据进行排序并将其插入到我们新创建的数据库中。

非常感谢您的帮助。

问题
two.php检查脚本顶部的$_POST[]数组:

if (empty($_POST))
{
  $response = array('status' => 'fail', 'message' => 'empty post array');
  echo json_encode($response);
  exit;
}

通常,除非post数组是empty(),否则不会触发。但是,当通过one.php将数据从two.php发送到cURL时,我收到上述编码数组作为我的回复,而我的数据不会进一步向下two.php

我将列出以下文件中的相关代码,以便您获得观看的乐趣:

one.php

$one_array = array('name' => 'John', 'fav_color' => 'red');
$one_url   = 'http://' . $_SERVER['HTTP_HOST'] . '/path/to/two.php';

$response = post_to_url($one_url, $one_array, 'application/json');
echo $response; die;

目前正在向我提供以下内容:

{"status":"fail","message":"empty post array"}

post_to_url()函数,供参考

function post_to_url($url, $array, $content_type) 
{
  $fields = '';
  foreach($array as $key => $value) 
  { 
    $fields .= $key . '=' . $value . '&'; 
  }

  $fields = rtrim($fields, '&');

  $ch = curl_init();
  $httpheader = array(
    'Content-Type: ' . $content_type,
    'Accept: ' . $content_type
  );

  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader);

  $result = curl_exec($ch);

  curl_close($ch);

  return $result;
}

two.php

header("Content-type: application/json");
$response = array(); //this is used to build the responses, like below

if (empty($_POST))
{
  $response['status']  = 'fail';
  $response['message'] = 'empty post array';
  echo json_encode($response);
  exit;
}
elseif (!empty($_POST))
{
  //do super neat stuff
}

2 个答案:

答案 0 :(得分:6)

因为您将请求正文内容类型设置为“application / json”,所以PHP不会在“two.php”中填充$_POST。因为您要发送网址编码数据,所以最好的办法就是只发送Accept:标题:

curl_setopt($ch, CURLOPT_HTTPHEADER, ['Accept: ' . $content_type]);

那就是说,“two.php”实际上并没有使用Accept:标头而总是输出JSON;在这种情况下,您可以完全不设置CURLOPT_HTTPHEADER

更新

从数组创建url编码数据也可以更简单(也更安全):

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($array));

答案 1 :(得分:0)

我有类似的问题,但在我的情况下,我添加了

Content-Type: {APPLICATION/TYPE}
Content-Length: {DATA LENGTH}

问题解决了。