Я работаю с PHP / CURL и хотел бы отправить данные POST на мой скрипт phantomjs, установив массив postfields ниже:
В моем php-контроллере у меня есть:
$data=array('first' => 'John', 'last' => 'Smith'); $url='http://localhost:7788/'; $output = $this->my_model->get_data($url,$data);
В моей модели php у меня есть:
public function get_data($url,$postFieldArray) { $ch = curl_init(); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"); curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, $postFieldArray); curl_setopt($ch, CURLOPT_URL, $url); $output = curl_exec($ch);
В моем сценарии phantomJS, который я запускаю локально, у меня есть:
// import the webserver module, and create a server var server = require('webserver').create(); var port = require('system').env.PORT || 7788; console.log("Start Application"); console.log("Listen port " + port); // Create serever and listen port server.listen(port, function(request, response) { // Print some information Just for debbug console.log("We got some requset !!!"); console.log("request method: ", request.method); // request.method POST or GET if(request.method == 'POST' ){ console.log("POST params should be next: "); console.log("POST params: ",request.post); exit; }
Сначала я запускаю и запускаю скрипт phantomjs (myscript.js) из командной строки, затем запускаю свой php-скрипт.
Выход:
$ phantomjs.exe myscript.js Start Application Listen port 7788 null We got some requset !!! request method: POST POST params should be next: POST params: ------------------------------e70d439800f9 Content-Disposition: form-data; name="first" John ------------------------------e70d439800f9 Content-Disposition: form-data; name="last" Smith ------------------------------e70d439800f9--
Я смущен о выходе. Я ожидал чего-то большего:
first' => 'John', 'last' => 'Smith
Может кто-нибудь объяснить, почему это выглядит так? Как я могу проанализировать объект request.post для назначения переменных внутри myscript.js
Редактировать:
Я внесли изменения, которые вы предложили в ответ. Как отправить данные POST в скрипт phantomjs .
Как вы предположили, я изменил кодировку php / curl на
curl_setopt($ch, CURLOPT_POSTFIELDS, urlencode(json_encode($postFieldArray)));
В сценарии phantomjs у меня есть:
if(request.method == 'POST' ){ console.log("POST params should be next: "); console.log(request.headers); var data = JSON.parse(request.post); console.log("POST params: ",data);
когда я запускаю скрипт из php, я вижу следующее в моей консоли:
Start Application .... POST params should be next: [object Object]
На этом этапе скрипт зависает, и я не вижу никакого вывода в консоли браузера dev tools. Можете ли вы посоветовать мне, как увидеть содержимое объекта?
Похоже, что форма кодируется как multipart/form-data
а не application/x-www-urlencoded
. Очевидно, PHP делает это, когда значение CURLOPT_POSTFIELDS
является массивом. Вы можете проверить это, добавив console.log(request.headers)
в свой код отладки.
К сожалению, похоже, что PhantomJS не поддерживает multipart/form-data
. Если вы не хотите найти другой веб-сервер, самым простым решением, вероятно, будет вручную кодировать данные с помощью JSON. Я исправил ошибку в своем предыдущем ответе и добавил примерный код.