将参数从外部PHP服务传递到CakePHP控制器操作

时间:2011-08-18 09:18:37

标签: php cakephp weborb

在这里提出这个问题,因为在CakePHP谷歌小组没有得到答案。我有以下管道: 有一个基于CakePHP的应用程序。它有一个名为save_results的动作控制器。 该动作是一个接受3个参数的方法。所以它看起来像这样:

function save_results($data,$rawdataset,$status){

 ///stub///
   return "all the data received";
}

除了CakePHP应用程序,我还有一个WebOrb(PHP),我用它来使用AMF格式与Flash应用程序进行通信。闪存应用程序将数据发送到WebOrb服务,然后将其发送到上面我在Cake中描述的操作。我从Flash应用程序3对象匹配我传递给cake方法的params(save_results): data -of对象数组。 rawdataset-of包含xml对象的字符串。 status-unsigned integer 0或1。 在WebOrb服务中,从Flash接收的数据是可以的。但是当我尝试将其进一步发送到CakePHP时,它不会通过。 我这样做(在WebOrb类中):

public function sendToCake($data,$rawdataset,$status){


    $encodedData=urlencode($data);
    $encodedRawData=urlencode($rawdataset);

    $destinationURL="http://localhost/mycakeapp/resultscontroller/save_results  /".$encodedData."/". $encodedRawData."/".$status;

   return file_get_contents( $destinationURL);

}

我发现传入url for cake的参数在characters.SO之间不能有空格。我使用urlencode()。它适用于像“Hello world”这样的简单字符串。但是一旦我传递了更复杂的字符串,比如xml字符串($ rawdataset对象)蛋糕没有收到这样的电话。我也试过rawurlencode()但仍然没有结果。蛋糕是否有可能在通过http调用传递时不知道如何处理xml结构化字符串?任何有关此问题的帮助或建议都将受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

对于您的WebOrb类,请更改它,以便使用HttpRequest代替:

public function sendToCake($data,$rawdataset,$status){
    $url = 'http://localhost/mycakeapp/resultscontroller/save_results';
    $r = new HttpRequest($url, HttpRequest::METH_GET);
    $r->addQueryData(array('data' => $data, 'rawdata' => $rawdata, 'status' => $status));

    try {
        $r->send();
        return $r->getResponseData();
    } catch (HttpException $ex) {
        return $ex;
    }    
}

^^您可能需要稍微调整一下才能准确地返回您想要的内容。 对于CakePHP Controller / Action,您可以通过Parameters Attribute访问get请求。

function save_results(){
    $data = $this->params[];
    //do stuff to my data;
    return $data;
}

希望有所帮助!

答案 1 :(得分:0)

这个问题与CakePHP和WebORb没有特别的关系,但它是一个关于如何使用具有特殊字符的查询字符串对URL进行HTTP GET的一般性问题。服务器返回代码500表示MVC框架正在返回服务器错误,这表明请求格式不正确。在将来 - fwiw - 最好有一个Apache错误日志的快照工具,以查看代码500背后抛出了什么样的错误。

以下是应该发生的事情:

程序想要对url / controller / action / query_string

执行HTTP GET

query_string应该是url_encoded但另外,由于查询字符串可能包含用于破坏字符串的引号和&符号,因此它也应该用htmlentities处理

在Michael的案例中,他有3个参数 - $ data,$ rawdataset,$ status组成一个查询字符串 像这样:service / controller / action / data / rawdataset / status

这是一个应该有效的PHP代码片段:

$ query_string = urlencode($ data)。 '/'。 。进行urlencode($ rawdataset) '/' 进行urlencode($状态);

然后执行http_get('service /'。htmlentities($ query_string)) http_get将返回HTTP响应。

HTTP POST可以使用类似的策略

通常,除非查询字符串是整数,否则需要这样做。

在实际处理查询字符串的CakePHP Controller操作中,可以静静地调用Sanitize类,如下所示:

应用::进口( '消毒');

类服务扩展AppController {     ...     ... }

AFAIK - 如果您使用CakePHP的ORM方法(例如find()和save())和正确的数组表示法(即数组('field'=> $ value))而不是原始SQL,则控制器操作已经是免受SQL注入漏洞的影响。一旦数据参数达到控制器操作,就不需要执行手工制作的SQL。

无论如何,这是任何MVC框架(如CakePHP,RoR或Django)的最佳实践。

让我知道它是如何运作的 丹尼