问这个问题,因为在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。
让我知道它是如何工作的丹尼