首页 > 解决方案 > 为什么我在 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'];

(返回“成功”)

标签: phpjsonclasscurl

解决方案


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

  • 由于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从上面的代码中去掉。


推荐阅读