0

我在 codeignter 中使用 xmlprc 服务器进行 Web 服务。我的应用程序的流程是我需要将参数传递给 xmlrpc 服务器方法,然后该方法应该调用另一个控制器类方法,该方法将在 js 函数中设置参数,并且同时调用该 js 方法。我面临的问题是从 xmlrpc 服务器方法调用控制器类方法并获取对服务器父方法的响应,然后可以使用 xmlhttprequest 获取该响应。

我的 xmlrpc 服务器方法是:

 function update_p($request) {
 $parameters = $request->output_parameters();
 $this->session->set_userdata(array("portfolio" =>$parameters['0']["portfolio"]));
 $this->session->set_userdata(array("filter" =>$parameters['0']["filter"]));

          $url  = base_url("ControllerClass/update_p?".$parameters['0']["portfolio"].'&'.$parameters['0']["filter"]);
           header("Location: $url");

    $xml_rpc_rows=array("portfolio"=>$parameters['0']["portfolio"],"filter"=>$parameters['0']["filter"]);



        $response = array(
            $xml_rpc_rows,
            'struct');
         $this->xmlrpc->send_response($response);



    }

控制器类方法:

public function update_p() {
        $loginid = $this->session->userdata('loginid');
        if(!isset($loginid)){
            die;
        }
        error_reporting(E_ERROR);
        if (time()>$this->session->userdata('expire')) { redirect("/dashboard/logout?expired=Y","location",401); die; }

        $out='';

        $request="USER ".$loginid.($this->session->userdata('isMobile')?"@mobile":"")."\n";


        if(isset($_GET["portfolio"])) {
            $portfolio=trim($_GET["portfolio"]);
            $request.='ECHO "LISTP":'."\nLISTP0 #".$portfolio;
            if(isset($_GET["filter"])) {
                $filter=trim($_GET["filter"]);
                $request.=" -".$filter;
            }
            if(isset($_GET["sort"])) {
                $sort=trim($_GET["sort"]);
                if ($sort>=1024) $request.=" -s".($sort&1023);
                else $request.=" -S".$sort;
            }
            $ph = isset($_GET["first"]);
            if ($ph) { 
                $this->load->model('Model');
                $resultArray = $this->Model->getData($this->session->userdata('loginid'),$this->session->userdata('isMobile')?'mobile':'default','listp');
                $request.=" ".$resultArray[0]['listp'];
            }
            $request.="\nECHO ,\n";
            if(isset($_GET["watch"])) {
                $portfolio=trim($_GET["watch"]);
                if ($ph)
                    $resultArray = $this->Model->getData($this->session->userdata('loginid'),$this->session->userdata('isMobile')?'mobile':'default','watch');
                $request.='ECHO "watchl":'."\nLISTP1 #".$portfolio." -WL ".($ph?$resultArray[0]['watch']:"")."\n";
                $request.='ECHO ,"watchs":'."\nLISTP1 #".$portfolio." -WS\nECHO ,\n";
            }
        }
        $request.="RISk\nECHO ,\nPnL\n";

        if ($result=$this->getData($request."BYE\n")) {
            if (result!='') $out=$result."\n";
        }

        ob_start('ob_gzhandler');
        echo "{".$out."}";
        ob_end_flush();

    }

我不知道如何在服务器方法中获得控制器方法的结果,任何可以对此有所了解的人将不胜感激。谢谢你。

4

1 回答 1

0

您的控制器方法期望将结果作为 echo 语句输出,该语句会发送到浏览器,而不是在变量中返回它。这意味着您的服务器函数必须尝试捕获该控制器方法的输出。这种设置更加尴尬并且容易出错。

除非您还需要直接从浏览器访问您的 update_p 方法,否则您应该更改您的控制器以简单地返回输出,这实际上意味着该控制器更像是一个库,并且可能应该放在库文件夹中。您将需要稍微更改您的控制器代码,这样您就可以将它们作为参数获取,而不是从 $_GET 获取参数,这在 CodeIgniter 中是您无论如何都应该做的。

因此,从 update_p 的末尾开始,只需执行此操作而不是您的回声:

return "{".$out."}";

然后在您的 xmlrpc 服务器中执行以下操作:

$controller = new ControllerClass();
$result = $controller->update_p($parameters['0']["portfolio"], $parameters['0']["filter"]);

然后用你的 $result 做任何你想做的事。

于 2013-09-13T09:57:09.680 回答