我在这里有这个功能:
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://输入流)一起传递。有什么想法吗?
答案 0 :(得分:0)
发现问题所在。
我正在调用http://localhost/api,因为我认为它会自动加载index.php,然后我会更改文件夹的默认文件名。
问题在于我最后没有添加index.php - 我应该调用http://localhost/api/index.php。 这种方式与cURL和fopen一起使用。
如何在不泄露文件名的情况下调用API的任何想法?