【问题标题】:Why i get no response on cUrl with class?为什么我在 cUrl 上没有得到任何回应?
【发布时间】:2020-02-07 13:35:35
【问题描述】:

没有类,只是简单的代码,我的方法正在工作并获得“SUCCESS” 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 的问题吗?以及如何解决这个问题?

P.S:这是我上过的第一堂课,我用普通函数做得很好,但我还是想学习类函数

现在我明白了

注意:未定义变量:第 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?也许那是一些全局变量(因此它可以在没有类的情况下工作)?
  • 这是一个错误,我将 $url 更改为 $call_url 但相同。 (立即编辑线程)
  • 把$call_url改成$this->call_url看看。
  • 另外,由于call_url 似乎没有变化,您可以将其声明为常量。
  • 在你的 getUsers 函数中定义 $field_string 变量,如$field_string = '' 然后开始连接它。

标签: php json class curl


【解决方案1】:

对您的代码进行一些更改。

  • 由于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 在 cmets 中提到的,您应该始终将证书添加到您的 cURL 请求中以防止 avoid man in the middle attacks 攻击,this answer 展示了如何将证书添加到您的 cURL 请求中。

此外,您可以简单地使用http_build_query 而不是单独编码每个http_build_query 无论如何都会这样做。所以把上面代码中的urlencode去掉。

【讨论】:

  • 哦,最后一个问题:我使函数具有参数并进行了一些更改(工作)如何将箭头函数用于类函数?喜欢$command-&gt;THBS_API::CMD_EXTERNAL();
  • $command 由 $command = "getUserCount" 定义(可以是 getTheme 或我在外部 API 中定义的任何内容)
  • 只是我想使用$command-&gt;THBS_API::CMD_EXTERNAL(); 而不是THBS_API::CMD_EXTERNAL($command);
  • 我的意思是不要告诉别人如何做坏事,因为你可能认为他们永远需要这种糟糕的解决方法。如果您怀疑他们可能存在 SSL 问题,请告诉他们如何解决。
猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
相关资源
最近更新 更多