2011-12-21 42 views
12

Codeigniterを使用してPOSTリクエストで送信されたJSONオブジェクトを受信して​​解析しようとしていますが、「見つける」ことができません。JSONをCodeigniterコントローラーにポスト

これは私のコントローラのコードです:

public function parse() { 

    $json = $this->input->post(); 
    $json = stripslashes($json); 
    $json = json_decode($json); 

    print_r($json); 

} 

これは私のJSONオブジェクトです:

{"data":"value"} 

答えて

2

は、あなたがデータのキーを渡す必要があり

$json = $this->input->post('data'); 
$json = stripslashes($json); 
$json = json_decode($json); 
print_r($json); 

代わりにこれを試してみてください引数としてポスト配列から欲しい変数をpost()

+0

を返します。何も表示されません。 –

+0

これはうまくいきます:data = {"color": "blue"}でも問題ありませんか?私はCodeigniterの検証を使用することができるようにそれらを "変換"することができるライブラリでうまくいくでしょうか? –

-1

が、それは常に空に戻ります$this->input->post()を使用して、あなたはPOSTデータを持っていることを確認し

json_decode(array($this->input->post())) 

OR

$tmp[] = (array)json_decode($this->input->post()); 

print_r($tmp); 
+1

$ this-> input-> post()配列は常に空です。なぜ私は理解できません。 –

+0

私もこれを試してみて空の配列を返します – Uahmed

0

してみてください、あなたが入力タイプ名の上に置く必要があります$this->input->post('name_of_input_text')

0

は確かです代わりにGETを実行しないでデータをPOSTしていますか?私は今日この問題に遭遇しました(これは私がこの質問を見つけた方法です)、私はPOSTをしていましたが、GETで終わったようなJSONPを使っていました。

CodeIgniterには、get_postという関数があり、get_postという関数は、どこからでもデータを取得します。

$this->input->get_post_string('data'); 

私は、これはあなたを助け願っています。

あなたが望む場合は手動で行うことができます。

function get_post($index = '', $xss_clean = FALSE){ 
    if (! isset($_POST[$index])) 
    { 
     return $this->get($index, $xss_clean); 
    } 
    else 
    { 
     return $this->post($index, $xss_clean); 
    } 
} 
21

これは正しい方法です。私はこれは古い記事ですけど、他の人が見ているため、これは役に立つかもしれません

$input_data = json_decode(trim(file_get_contents('php://input')), true); 
+0

php://入力は一度しか読み込めず、CodeIgniter入力クラスは既にこの点でそれを読み込んでいます。 –

+0

リクエストヘッダーに正しいコンテンツタイプ、 'Content-Type:application/json'を追加するだけです。 Chrisが述べたように、Codeigniterはメソッドが呼び出される前に入力を読み込みます。 – Shailesh

+0

あなたのコメントは何でも、私はこの回答を投稿した日付とは関係がありません。投稿日時には間違いありません。 – CMCDragonkai

0

ブラウザ側では、私はこのパターンに似たコードを使用して、私のデータパケットを作成します。

var form_data = { }; 
    $.each($('#mvt_dialog_form').serializeArray(), function() { 
     form_data[this.name] = this.value; 
    }); 

    // add the address data to the payload 
    var result = { 
     form_data: form_data, 
     locations: addressData, 
     selected_location: selectedLocation 
    }; 

    // now wrap it all up with a pretty bow 
    // Seriously, the key:value format is required for codeigniter INPUT class to be able to "see" 
    var movement = { 
     movement_dlg: JSON.stringify(result) 
    }; 

次に、サーバーへの移動を「送信」します。コントローラで 、私は、次のロジックを使用:あなたはの$ this - を使用する場合

// Perform XSS filtering 
    $postData = $this->input->post(NULL, TRUE); 
    $result = json_decode($postData['movement_dlg']); 
0

はちょうどあなたのリクエストヘッダ

Content-Type: application/json 
3
$post = json_decode($this->security->xss_clean($this->input->raw_input_stream)); 

に正しいコンテンツタイプを追加>入力 - >あなたをraw_input_streamそれを複数回読むことができ、基本的にはfile_get_contents( 'php:// input')と同じです。これはCI3で動作します。私はそれがCI2で動作するかわかりません。

0

フィールズの答えは正しいが、ここではもっと精巧な答えがある。私はコメントすることはできませんので、私は答えとして投稿しています。

CodeIgniterは、JSONをフェッチできません。 jQueryはフードトリックの一部を行い、データをform-data-xに変換します。そのため、content typeを指定していないとき、オブジェクトをエンコードしていないとき、または他の状況のときに動作します。

したい場合は、純粋なJSONソリューションは、あなたのJSONを取得し、phpjson_decodeを使用して、それをデコードする$this->input->raw_input_streamを使用することです。完全な答えは、以下のコードをチェックしてください:

Retrieve JSON POST data in CodeIgniter

2

は、このコードを試してみてください、それはすべてあなたのパラメータを持つ出力配列ます。

$this->input->raw_input_stream; 

$input_data = json_decode($this->input->raw_input_stream, true); 

$input_data残念ながらどちらか動作しませんでした配列

+0

このアプローチは私の仕事です。ありがとう – tthreetorch

関連する問題