Zend_HTTP_Client не позволяет мне размещать любые данные
Я искал во всем стеке потока и Google для решения моей проблемы.
Я создал два проекта с Zend Framework - Project1
а также Project2
- и я хочу реализовать веб-сервисы на одном из них. Идея состоит в том, чтобы отправить JSON-строку Project1
и получить обратно JSON со всеми деталями, связанными с этой переменной, используя POST. Теперь я создал TestController на Project2
:
public function indexAction(){
$uri = 'http://project1.com/WebService/data';
$config = array(
'adapter' => 'Zend_Http_Client_Adapter_Curl',
'curloptions' => array(CURLOPT_FOLLOWLOCATION => true),
);
$client = new Zend_Http_Client($uri, $config);
$request = $client->request('POST');
print_r($request->getBody());
exit();
}
Приведенный выше код работает. Это читает dataAction
от Project1
контроллер и дает мне вывод того, что отражается. Но когда я попробую это:
public function indexAction(){
$uri = 'http://project1.com/WebService/data';
$config = array(
'adapter' => 'Zend_Http_Client_Adapter_Curl',
'curloptions' => array(CURLOPT_FOLLOWLOCATION => true),
);
$client = new Zend_Http_Client($uri, $config);
$data = array(
'userID' => 'TEST TEST',
'value' => 1,
'description' => 'ABCDEFG',
);
$request = $client->request('POST');
$json = json_encode($data);
$client->setRawData($json, 'application/json')->request('POST');
exit();
}
И на стороне сервера, когда я пытаюсь отобразить внутри dataAction
:
public function dataAction(){
var_dump($this->getRequest()->getParam('var-name'));
var_dump($_POST);
die();
}
Я получаю вывод этого: NULL array(0) { } .... Я получаю такой же вывод, когда пытаюсь сделать это на стороне клиента. Также упомянуть.. Я также попытался открыть входной файл php://, но получил пустую строку...
Что мне не хватает??? Я разочаровался в поисках этого с утра, но не нашел решения.
Заранее спасибо за ответ.
1 ответ
Вот что вам не хватает:
$json = json_encode($data);
$client->setRawData($json, 'application/json')->request('POST');
отправляет запрос POST, но данные в теле POST не являются строкой в кодировке URL, а просто являются необработанным JSON.
призвание $this->getRequest()->getParam('foo')
смотрит на суперглобальные PHP $_GET
а также $_POST
который не будет содержать никаких параметров JSON. Причина, по которой он будет пустым, заключается в том, что PHP не может проанализировать данные POST, поскольку это был JSON, а не HTTP-кодированный URL-адрес.
Решение состоит в том, чтобы использовать что-то подобное в dataAction
если вы хотите получить данные JSON в теле POST.
$post = $this->getRequest()->getRawBody();
try {
$json = Zend_Json::decode($post);
// now access parameters from $json array
} catch (Zend_Json_Exception $ex) {
echo "Failed to decode request, POST did not contain valid JSON.";
}
Изменить: Вот полный код, с которым вы можете связываться.
public function requestAction()
{
// CHANGE THIS
$uri = 'http://playground/zendapp/public/index/data';
$config = array(
'adapter' => 'Zend_Http_Client_Adapter_Curl',
'curloptions' => array(CURLOPT_FOLLOWLOCATION => true),
);
$client = new Zend_Http_Client($uri, $config);
$data = array(
'userID' => 'TEST TEST',
'value' => 1,
'description' => 'ABCDEFG',
);
$json = json_encode($data);
$resp = $client->setRawData($json, 'application/json')->request('POST');
var_dump($resp->getBody());
exit();
}
public function dataAction()
{
$post = $this->getRequest()->getRawBody();
try {
$json = Zend_Json::decode($post);
print_r($json);
} catch (Exception $ex) {
echo "failed to decode json";
}
exit;
}