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


Passing parameters from external PHP service to CakePHP controller actions

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

function save_results($data,$rawdataset,$status){
 ///stub///
   return "all the data received";
}

除了CakePHP应用程序,我有一个webb (PHP),我使用AMF格式与Flash应用程序通信。flash应用程序将数据发送给webb服务,然后webb服务将数据发送给上面在Cake中描述的操作。因此,我从Flash应用程序接收到3个对象来匹配我传递给cake方法(save_results)的参数:数据类型的数组对象。rawdatasset -类型字符串包含XML对象。状态-无符号整数0或1。在web服务中,从Flash接收到的数据是正常的。但当我试图将它发送到CakePHP时,它没有通过。我是这样做的(在web类中):

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的蛋糕不能字符之间有空格。所以我使用urlencode()。它适用于简单的字符串,如"Hello world"。但是,一旦我传递更复杂的字符串,如xml字符串($rawdataset object),蛋糕就不会收到这样的调用。我也尝试了rawurlencode(),仍然没有结果。是否有可能蛋糕不知道如何处理xml结构化字符串时通过http调用?如有任何帮助或建议,我将不胜感激。

对于你的webb类,改变它,使它使用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控制器/动作,你可以通过Parameters属性访问get请求。

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

希望有帮助!

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

下面是应该发生的事情:

程序想要执行一个HTTP GET到url/controller/action/query_string

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操作中,可以像这样静态地调用消毒类:

应用程序:进口("清洁");

类服务扩展AppController {……}

AFAIK -如果你使用CakePHP的ORM方法(如find()和save())和适当的数组符号(即。array('field' => $value))而不是原始SQL,控制器动作已经受到SQL注入漏洞的保护。一旦数据参数命中控制器动作,就不需要执行手工制作的SQL。

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

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