プロジェクトにZend Framework 1.xを使用しています。呼び出し元の関数に対してJSON文字列のみを返すWebサービスを作成したいと思います。私はZend_Controller_Action
を使用しようとし、それらの方法を適用しました:
1。
$this->getResponse()
->setHeader('Content-type', 'text/plain')
->setBody(json_encode($arrResult));
2。
$this->_helper->getHelper('contextSwitch')
->addActionContext('nctpaymenthandler', 'json')
->initContext();
3。
header('Content-type: application/json');
4。
$this->_response->setHeader('Content-type', 'application/json');
5。
echo Zend_Json::encode($arrResult);
exit;
6。
return json_encode($arrResult);
7。
$this->view->_response = $arrResult;
しかし、cURLを使用して結果を取得すると、いくつかのHTMLタグで囲まれたJSON文字列が返されました。次に、上記のオプションを使用してZend_Rest_Controller
を試してみました。それでも成功しませんでした。
PS:上記の方法のほとんどは、スタックオーバーフローで尋ねられた質問からのものです。
このように!
//encode your data into JSON and send the response
$this->_helper->json($myArrayofData);
//nothing else will get executed after the line above
レイアウトとビューのレンダリングを無効にする必要があります。
レイアウトとビューレンダラーを明示的に無効にします。
public function getJsonResponseAction()
{
$this->getHelper('Layout')
->disableLayout();
$this->getHelper('ViewRenderer')
->setNoRender();
$this->getResponse()
->setHeader('Content-Type', 'application/json');
// should the content type should be UTF-8?
// $this->getResponse()
// ->setHeader('Content-Type', 'application/json; charset=UTF-8');
// ECHO JSON HERE
return;
}
Jsonコントローラーアクションヘルパーを使用している場合は、jsonコンテキストをアクションに追加する必要があります。この場合、jsonヘルパーはレイアウトとビューレンダラーを無効にします。
public function init()
{
$this->_helper->contextSwitch()
->addActionContext('getJsonResponse', array('json'))
->initContext();
}
public function getJsonResponseAction()
{
$jsonData = ''; // your json response
return $this->_helper->json->sendJson($jsonData);
}
コンテンツが標準ページテンプレートでラップされないようにするには、コードでレイアウトも無効にする必要があります。しかし、はるかに簡単な方法は次のとおりです。
$this->getHelper('json')->sendJson($arrResult);
jSONヘルパーは変数をJSONとしてエンコードし、適切なヘッダーを設定し、レイアウトとビュースクリプトを無効にします。
はるかに簡単です。
public function init()
{
parent::init();
$this->_helper->contextSwitch()
->addActionContext('foo', 'json')
->initContext('json');
}
public function fooAction()
{
$this->view->foo = 'bar';
}