6

私は問題の解決策を求めて、stackoverflow と Google を検索しています。

Zend Framework を使用して 2 つのプロジェクトを作成しましProject1Project2が、そのうちの 1 つに Web サービスを実装したいと考えています。アイデアは、POST を使用して、JSON 文字列を送信し、Project1その変数に関連付けられたすべての詳細を含む JSON を受信することです。今、私は 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://input ファイルも開いてみましたが、空の文字列が得られました...

私は何が欠けていますか??? 朝から検索してイライラしましたが、解決策がありませんでした。

返信ありがとうございます。

4

1 に答える 1

5

不足しているものは次のとおりです。

$json = json_encode($data);
$client->setRawData($json, 'application/json')->request('POST');

POST リクエストを送信しますが、POST 本文のデータは URL エンコードされた文字列ではなく、生の JSON です。

呼び出しは、JSON パラメーターを含まない$this->getRequest()->getParam('foo')PHP スーパーグローバル$_GETを調べます。$_POST空になる理由は、PHP が POST データを解析できなかったためです。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;
}
于 2012-09-24T19:38:54.257 に答える