php - 为什么我在 cUrl 上没有得到任何回应?
问题描述
没有类,只是简单的代码,我的方法正在工作并获得“成功” response_status,但是当我把它放在一个类中时,我什么也得不到。
所有代码:
class THBS_API
{
private const call_url = "https://xxxxxxxxxxxx.xxx/endsoftware.php";
private $base_url;
private $fields;
private $fields_string;
public static function getUsers()
{
$base_url = $_SERVER['SERVER_NAME'];
$fields_string = '';
$fields = array(
'API_USER' => urlencode('xxxxxx@xxxxxx.xxx'),
'API_PASS' => urlencode('xxxxxxxxx'),
'CMD' => urlencode('getUserCount'),
'FROM' => urlencode($base_url));
//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string, '&');
//open connection
$ch = curl_init();
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $call_url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//execute post
$result = curl_exec($ch);
//close connection
curl_close($ch);
$response = json_decode($result, true);
return $response['response_status'];
}
}
echo THBS_API::getUsers();
很奇怪,但我认为是因为在类中声明变量不同,是我使用的问题privar $base_url
吗?以及如何解决这个问题?
PS:那是我上过的第一堂课,我用普通函数做得很好,但我还是想学习类函数
现在我明白了
注意:未定义变量:第 24 行 /srv/disk1/3203065/www/xxxxxxxxxxxxxxxxxx.com/API/clientapi.php 中的 fields_string
第 44 行:
return $response['response_status'];
没有类的代码(工作):
$base_url = $_SERVER['SERVER_NAME'];
$url = "https://xxxxxxxxxxx.com/API/endsoftware.php";
$fields = array(
'API_USER' => urlencode('xxxxxx@xxxxx.xxxx'),
'API_PASS' => urlencode('xxxxxxxxxx'),
'CMD' => urlencode('getUserCount'));
//url-ify the data for the POST
foreach($fields as $key=>$value) { $fields_string .= $key.'='.$value.'&'; }
rtrim($fields_string, '&');
//open connection
$ch = curl_init();
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($fields));
curl_setopt($ch,CURLOPT_POSTFIELDS, $fields_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//execute post
$result = curl_exec($ch);
//close connection
curl_close($ch);
$response = json_decode($result, true);
echo $response['response_status'];
(返回“成功”)
解决方案
对您的代码进行了一些更改。
由于
call_url
它始终是常量,因此您可以在类中将其声明为常量。其次是您将值与不需要
$field
的值一一连接。&
您可以http_build_query
为此使用功能。第三是你有
curl_setopt($ch,CURLOPT_POST, count($fields));
这是不正确的,因为这说只有当我们有超过 0 个字段时才发出 POST 请求。无论如何,您都希望提出适当的请求。因此,将其设置为true
始终。
片段:
<?php
namespace THBS_API;
class THBS_API{
private const call_url = "https://xxxxxxxxxxx.com/API/endsoftware.php";
public static function getUsers(){
$base_url = $_SERVER['SERVER_NAME'];
$fields = array(
'API_USER' => urlencode('xxxxxx@xxxxxx.xxx'),
'API_PASS' => urlencode('xxxxxxxxx'),
'CMD' => urlencode('getUserCount'),
'FROM' => urlencode($base_url)
);
//open connection
$ch = curl_init();
//set the url, number of POST vars, POST data
curl_setopt($ch,CURLOPT_URL, self::call_url);
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_POSTFIELDS, http_build_query($fields));
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false); // add certificates once you have them(recommended)
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//execute post
$result = curl_exec($ch);
//close connection
curl_close($ch);
$response = json_decode($result, true);
return $response['response_status'];
}
}
echo THBS_API::getUsers();
更新:
正如@Dharman在评论中提到的那样,您应该始终将证书添加到您的 cURL 请求中以进行avoid man in the middle attacks
攻击,这个答案显示了如何将证书添加到您的 cURL 请求中。
此外,您可以简单地使用http_build_query
而不是单独对每个编码进行编码,http_build_query
因为无论如何都会这样做。所以urlencode
从上面的代码中去掉。
推荐阅读
- node.js - 使用 Nginx 作为 AWS EC2 上的代理服务器,使用 socket.io 运行 NodeJs 应用程序
- ios - IOS 11.4.1 上的 AVFoundation、AVAudioSessionRouteChange 行为不正确
- php - Laravel:如何在子进程中通过 Eloquent 更新 MySQL?
- windows - 通过 Electron 访问当前高亮文本
- php - 1 个模型中的 2 个查询 (CodeIgniter)
- javascript - 自将 ASP.NET 站点从 HTTP 更改为 HTTPS 后,自动完成/即时搜索结果框停止工作
- python - 将函数的输出保存在python的csv文件中
- vaadin - 在 UI 中单独加载组件
- oracle - Oracle XMLQuery - 显示带有两个 XML 节点的逗号分隔列表
- c# - ASP.NET.MVC 5 为控制器的操作添加权限