Передача параметров из внешнего сервиса PHP в действия контроллера CakePHP - PullRequest
1 голос
/ 18 августа 2011

Задавая этот вопрос здесь, потому что в CakePHP группа Google не получила ответа. У меня есть следующий конвейер: Существует приложение на основе CakePHP. У него есть контроллер с действием, называемым save_results.Действие - это метод, принимающий 3 аргумента. Так это выглядит так:

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

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

Помимо приложения CakePHP, у меня есть WebOrb (PHP), который я использую для связи с приложением Flash с использованием формата AMF. Приложение Flash отправляетданные в службу WebOrb, которая затем отправляет их в действие, которое я описал выше в Cake. Таким образом, я получаю из приложения Flash 3 объекты, соответствующие параметрам, которые я передаю в метод cake (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 для торта, не может иметь пробелов между символами. Поэтому я использую urlencode (). Он работает для простых строккак "Hello world". Но как только я передаю более сложные строки, такие как строки xml (объект $ rawdataset), торт не получает такой вызов. Я пробовал также rawurlencode () и все еще без результатов. Возможно, торт незнаете, как обрабатывать структурированные строки XML при передаче через HTTP-вызов?Любая помощь или совет по этому вопросу будут высоко оценены.

Ответы [ 2 ]

1 голос
/ 18 августа 2011

Для вашего класса 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 внутри него вы можете получить доступ к запросу через атрибут Параметры .

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

Надеюсь, что это поможет!

0 голосов
/ 19 августа 2011

Вопрос не относится конкретно к CakePHP и WebORb, но это общий вопрос о том, как выполнить HTTP GET для URL со строкой запроса, содержащей специальные символы.Код возврата сервера, равный 500, указывает на то, что платформа MVC возвращает ошибку сервера, что указывает на то, что запрос не был правильно сформирован.В будущем - fwiw - хорошо иметь мгновенный магазин журнала ошибок Apache, чтобы увидеть, какая ошибка была выдана за кодом 500.

Вот что должно происходить:

Программа хочет выполнить HTTP GET для url / controller / action / query_string

query_string должен быть url_encoded, но кроме того, поскольку строка запроса может содержать кавычки и амперсанды, которые разбивают строку, она также должна обрабатываться с помощьюhtmlentities

В случае Майкла у него есть 3 параметра - $ data, $ rawdataset, $ status, которые составляют строку запроса, такую ​​как: service / controller / action / data / rawdataset / status

Здесьфрагмент кода PHP, который должен работать:

$ query_string = urlencode ($ data).'/'.urlencode ($ rawdataset). '/'. urlencode ($ status);

затем выполните http_get ('service /'. htmlentities ($ query_string)), http_get вернет HTTP-ответ.

Аналогичная стратегия может быть использована для HTTP POST

В общем случае, если строка запроса не является целым числом, это то, что необходимо сделать.

Внутри действия контроллера CakePHP, которое фактически обрабатываетэту строку запроса можно статически вызвать классом Sanitize следующим образом:

App :: import ('Sanitize');

Служба класса расширяет AppController {... ...}

AFAIK - если вы используете методы ORM в CakePHP (такие как find () и save ()) и правильную запись массива (т. Е. Array ('field' => $ value)) вместо необработанного SQL, действие контроллера будетуже защищены от уязвимостей SQL-инъекций.Не должно быть необходимости выполнять вручную созданный SQL, как только параметры данных попадают в действие контроллера.

В любом случае это лучший метод в любой среде MVC, такой как CakePHP, RoR или Django.

Позвольте мнезнать, как это работает Дэнни

...