3

CodeIgniter を使用して RESTful アプリケーションに取り組んでいますが、コントローラーで POST された json データにアクセスできません。

アプリがリモートサーバーで開発されている間、ローカルマシンでcURL経由でjsonを投稿しています。

問題のコントローラーコードは次のとおりです。

class Products extends CI_Controller
{
  public function __construct()
  {
    $this->load->model(products_model);
  }
  public function index($id = FALSE)
  {
    if($_SERVER['REQUEST_METHOD'] == 'GET')
    {
      // fetch product data
      $product_data = $this->products_model->get_products($id)

      // set appropriate header, output json
      $this->output
        ->set_content_type(application/json)
        ->set_output(json_encode($product_data));
    }
    elseif($_SERVER['REQUEST_METHOD'] == 'POST')
    {
      // debugging for now, just dump the post data
      var_dump($this->input->post());
    }

  }
}

GET アクションは十分に機能しており、ブラウザーから要求されたとき、または cURL 要求を介して適切なデータを返します。ただし、cURL 経由で json データを POST しようとするbool(FALSE)と、インデックス関数の POST セクションから一貫して返されます。私が作っているcURLリクエストは次のとおりです。

curl -X POST -d @product.json mydomain.com/restfulservice/products

また、product.json ファイルの内容は次のとおりです。

{"id":"240",
"name":"4 x 6 Print",
"cost":"1.5900",
"minResolution":401,
"unitOfMeasure":"in",
"dimX":0,
"dimY":0,
"height":4,
"width":6}

json データを除外し、次のようなものを渡す、cURL 経由で別の POST を作成しました。

curl -X POST -d '&this=that' mydomain.com/restfulservice/products

どちらが返されますか

array(1) {
  ["this"]=>
  string(4) "that"
}

何を与える?jsonで何か?有効です。form_open()CI を使用する必要があり、CIがないと正しく動作しないことを理解しているため、application/config/config.php でグローバル CSRF と XSS をオフにしました。からパラメーターを除外する$this->input->post()と、すべての投稿アイテムが返されることを理解していますが、引き続き何も取得しません。$_POSTまた、CI の入力ライブラリを調べて、PHP の変数を介してデータにアクセスしようとしましたが、違いはありませんでした。

4

2 に答える 2

5

投稿データはクエリ文字列形式ではないため、$_POST の処理を​​スキップして、生の投稿データに直接進む必要があります。

試す

var_dump($HTTP_RAW_POST_DATA);

またはさらに良い

var_dump(file_get_contents("php://input")); 
于 2012-10-04T20:17:55.503 に答える
2

codeigniter 2.X では、Input クラスをオーバーライドして、必要な機能を追加できます。 https://ellislab.com/codeigniter/user-guide/general/core_classes.html

  1. ファイル MY_Input.php を application/core に追加します
  2. このファイル内にコードを追加します。

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MY_Input extends CI_Input {

    public function raw_post() {
        return file_get_contents('php://input');
    }

    public function post($index = NULL, $xss_clean = FALSE) {
        $content_type = $this->get_request_header('Content-type');

        if (stripos($content_type, 'application/json') !== FALSE
            && ($postdata = $this->raw_post())
            && in_array($postdata[0], array('{', '['))) {

            $decoded_postdata = json_decode($postdata, true);
            if ((json_last_error() == JSON_ERROR_NONE))
                $_POST = $decoded_postdata;
        }

        return parent::post($index, $xss_clean);
    }
}

それでおしまい..

通常のポストと同じように使用してください。

于 2015-02-01T12:09:18.460 に答える