【问题标题】:How to save one variable from rpc server response?如何从 rpc 服务器响应中保存一个变量?
【发布时间】:2020-09-27 17:45:45
【问题描述】:

我想将我的 RPC 钱包服务器与我的 WEB 服务器使用 RPC 和 PHP 库连接到我的 litecolin 守护程序服务器。

这是我用来连接服务器的库。

[LITECOIN PHP LIBARY][1] [1]:

这是我的 index.php,它将生成新地址来存放莱特币 :)

$litecoind = new LitecoinClient([
    'scheme' => 'http',                 // optional, default http
    'host'   => '1HIDDEN.HIDDEN.HIDDEN.0',            // optional, default localhost
    'port'   => PRIVATE,                   // optional, default 9332
    'user'   => 'HIDDEN',              // required
    'pass'   => 'HIDDEN',          // required

]);

$alo=$litecoind->getnewaddress();
?>

<pre>
<?php 
print_r($alo);
?>
</pre>

所以当我得到响应时,我会得到一些非常困难的数组来为我读取,并且从他那里我只需要这个块中的变量作为 [响应]

     [container:protected] => Array
            (
                [result] => MUZiKwDneYD7a6G8Sx3TQjVZqfC3JkDobu
                [error] => 
                [id] => 0
            )

这是来自服务器的完整响应打印为漂亮的打印:

Majestic\Litecoin\LitecoindResponse Object
(
    [response:protected] => GuzzleHttp\Psr7\Response Object
        (
            [reasonPhrase:GuzzleHttp\Psr7\Response:private] => OK
            [statusCode:GuzzleHttp\Psr7\Response:private] => 200
            [headers:GuzzleHttp\Psr7\Response:private] => Array
                (
                    [Content-Type] => Array
                        (
                            [0] => application/json
                        )

                    [Date] => Array
                        (
                            [0] => Mon, 08 Jun 2020 17:09:32 GMT
                        )

                    [Content-Length] => Array
                        (
                            [0] => 68
                        )

                )

            [headerNames:GuzzleHttp\Psr7\Response:private] => Array
                (
                    [content-type] => Content-Type
                    [date] => Date
                    [content-length] => Content-Length
                )

            [protocol:GuzzleHttp\Psr7\Response:private] => 1.1
            [stream:GuzzleHttp\Psr7\Response:private] => GuzzleHttp\Psr7\Stream Object
                (
                    [stream:GuzzleHttp\Psr7\Stream:private] => Resource id #44
                    [size:GuzzleHttp\Psr7\Stream:private] => 
                    [seekable:GuzzleHttp\Psr7\Stream:private] => 1
                    [readable:GuzzleHttp\Psr7\Stream:private] => 1
                    [writable:GuzzleHttp\Psr7\Stream:private] => 1
                    [uri:GuzzleHttp\Psr7\Stream:private] => php://temp
                    [customMetadata:GuzzleHttp\Psr7\Stream:private] => Array
                        (
                        )

                )

        )

    [container:protected] => Array
        (
            [result] => MNTRoGELAMYRLm395Yj2sWYTPrnGi6URwz
            [error] => 
            [id] => 0
        )

    [current:protected] => 
)

这对于不了解 json 响应的人来说很难理解如何只获取 [response] 并将其保存到 sql,当然我知道如何保存到 mysql 但如何只获取该响应变量很难对我来说,所以我想请任何知道在这里做什么的人来帮助我,甚至为我指出一些简单的解决方案。

非常感谢您阅读我的代码。 感谢您以后的回复和帮助!

你的朋友 :)

编辑: 如果这不是 json 响应,谁能告诉我这个响应是什么以及如何获得我需要的结果(钱包)变量。当我想回显我的 $alo 变量时,我得到了对象无法转换为字符串的错误...什么

【问题讨论】:

  • "如果这不是 json 响应"...它可能是来自远程服务器的 JSON,但看起来库已经解析了 JSON 并将其转换为常规PHP 对象。因此,您可以像使用任何其他 PHP 对象一样使用它,并访问其属性和方法。您使用的 print_r 命令只是打印出 PHP 对象的结构,这样您就可以看到它的所有属性,然后您就知道可以访问什么。如果你知道如何使用 PHP 对象,那么你应该知道,或者至少有一个基本的想法,如何从这个对象中获取信息。
  • 这是一个解码的响应。如果添加$alo = json_encode($alo);,它将以 JSON 格式编码。
  • 那是因为你不能回显一个对象——你认为 PHP 应该打印什么来显示 整个 对象,包括构造函数、方法、属性等?这就是为什么存在诸如 print_r 和 var_dump 之类的调试工具来显示关于代码对象的那种信息的原因。如果要从对象中打印某些特定的数据项,则需要直接引用这些项。
  • 正确学习如何操作 PHP 对象,将是第一步!这对你来说将是一项重要的编程技能。但这里最大的问题是container 是一个“受保护”的属性。这意味着它不能在类(或从它继承的类)之外访问 - 您还应该了解visibility
  • 根据source code of the class 应该可以调用result() 函数来返回容器对象的“结果”部分。例如echo $alo-&gt;result();

标签: php html json response litecoin


【解决方案1】:

这里最大的问题是container 是一个“受保护”的属性。这意味着它不能在类(或从它继承的类)之外访问 - 这在此处的 PHP 文档中有所描述:https://www.php.net/manual/en/language.oop5.visibility.php

然而,虽然库的文档没有提及它,但根据source code of the class 应该可以调用result() 函数来返回容器对象的“结果”部分。

例如

echo $alo->result();

作为参考,result() 函数在LitecoindResponse 类的源代码中如下所示:

/**
 * Gets result array.
 *
 * @return array|null
 */
public function result()
{
    if ($this->hasResult()) {
        return $this->container['result'];
    }
}

【讨论】:

    【解决方案2】:

    你可以这样访问它

    $myval = $alo["container"];
    foreach($myval as $myvals){
    var_dump($myvals);
    }
    
    

    【讨论】:

    • 非常好,但我仍然没有得到响应。警告:在第 22 行的 index.php 中为 foreach() 提供的参数无效
    • @Ajmoopetpokusat 在 foreach 之前添加 var_dump($myval); 并注释掉 foreach 循环。
    • @Ajmoopetpokusat 你能在 foreach echo 响应之前添加$alo = json_encode($alo); 并将其添加到你的答案中吗?
    • @C0deB0untyHunter 1) container:protected 不是属性的名称。请确保您了解如何解释 print_r 命令的输出。 2) 该属性是protected,这意味着它不能从课堂外访问。因此,由于这些原因,此代码无法正常工作。
    • @Ajmoopetpokusat 我已经在上面的其他 cmets 中回复了一些您可能会觉得有用的东西。请看一下。
    猜你喜欢
    • 2023-02-14
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多