我一直在遍历stackoverflow和谷歌寻找解决我问题的方法。
我使用Zend Framework创建了两个项目 - Project1
和Project2
- 我想在其中一个项目上实现Web服务。我们的想法是将JSON字符串发送到Project1
并使用POST接收带有与该变量相关的所有详细信息的JSON。现在我在Project2
上创建了一个TestController:
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数组(0){} ....当我在客户端尝试时,我得到相同的输出。还要提一下..我也尝试打开php://输入文件,但得到一个空字符串...
我缺少什么?我从早上起就对自己的搜索感到沮丧,但没有解决方案。
提前感谢您的回复。
答案 0 :(得分:5)
以下是您遗失的内容:
$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编码的内容。
如果您想在POST正文中接收JSON数据,解决方案是在dataAction
中使用类似的内容。
$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;
}