用curl发布json数据并失败

时间:2012-01-03 20:24:20

标签: php json curl

我在这里有这个功能:

public static function call($action, array $args) 
{
  $post_args = array(
                'action'  => $action,
                'args'    => $args
               );
  $stream    = json_encode($post_args);
  $headers   = array(
                 'Content-type: application/json',
                 'Accept: application/json',
                 'Expect:'
               );
  $userpwd   = self::$_user.':'.sha1(sha1(self::$_pass));

  $ch   = curl_init();
  $args = array(
           CURLOPT_URL            => self::$_url,
           CURLOPT_FOLLOWLOCATION => TRUE,
           CURLOPT_RETURNTRANSFER => TRUE,
           CURLOPT_POST           => TRUE,
           CURLOPT_POSTFIELDS     => $stream,
           CURLOPT_HTTPHEADER     => $headers,
           CURLOPT_USERPWD        => $userpwd
          );
  curl_setopt_array($ch, $args);
  $res  = curl_exec($ch);
  $data = json_decode($res, true);
  if (isset($data) === TRUE
      && empty($data) === FALSE
  ) {
    $res = $data;
  }
  return $res;

}//end call()

在我发布的网址上,我只是在做:

echo file_get_contents('php://input');

但是什么都没有,即使我发布了数据。可能是什么问题呢?我走到了尽头。

另外,当我刚刚在本地计算机上发布一个简单的虚拟主机URL而不进行任何重定向时,为什么我需要将CURLOPT_FOLLOWLOCATION设置为TRUE。

修改

尝试像fopen一样重做它:

public static function call($action, array $args) 
{
  $post_args = array(
                'action'  => $action,
                'args'    => $args
               );
  $stream    = json_encode($post_args);

  $userpwd   = self::$_user.':'.sha1(sha1(self::$_pass));

  $opts = array(
           'http' => array(
                      'method'  => 'POST',
                      'header'  => array(
                                     "Authorization: Basic ".base64_encode($userpwd),
                                     "Content-type: application/json"
                                   ),
                      'content' => $stream
                     )
          );

  $context = stream_context_create($opts);

  $res = '';
  $fp = fopen(self::$_url, 'r', false, $context);
  if($fp){
    while (!feof($fp)){
      $res .= fread($fp, 128);
    }
  }
  return $res;

}//end call()

没有成功。连接与curl和fopen一起使用,因为我将状态与result(这只是php://输入流)一起传递。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

发现问题所在。

我正在调用http://localhost/api,因为我认为它会自动加载index.php,然后我会更改文件夹的默认文件名。

问题在于我最后没有添加index.php - 我应该调用http://localhost/api/index.php。 这种方式与cURL和fopen一起使用。

如何在不泄露文件名的情况下调用API的任何想法?