2011-12-21 22 views
12

Estoy tratando de recibir y analizar un objeto JSON enviado en una solicitud POST usando Codeigniter, pero no puedo "encontrarlo".Publicar el controlador JSON en Codeigniter

Este es mi código del controlador:

public function parse() { 

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

    print_r($json); 

} 

Ésta es mi JSON objeto:

{"data":"value"} 

Respuesta

2

Tal vez puedas probar

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

Tiene que pasar en la clave de los datos variable que desea de la matriz posterior como argumento post()

+0

que lamentablemente no funcionó bien. Nada se muestra. –

+0

Esto funciona: data = {"color": "blue"} pero ¿está bien? Sería genial contar con una biblioteca que pudiera "convertirlos" para poder usar la validación de Codeigniter. –

-1

tratar

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

O

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

print_r($tmp); 
+1

$ this-> input-> post() array siempre está vacío. No puedo entender por qué. –

+0

intenté esto también y me da una matriz vacía – Uahmed

0

asegurarse de que tiene datos POST, utilizando $this->input->post() siempre volverá vacía, es necesario poner en el nombre del tipo de entrada $this->input->post('name_of_input_text')

0

¿Seguro ¿Estás PUBLICANDO los datos y no haciendo un GET? Me encontré con este problema el día de hoy (que es cómo encontré esta pregunta) y estaba haciendo un POST pero usando JSONP que parece estar hecho con un GET.

CodeIgniter tiene una función llamada get_post que obtendrá los datos desde donde sea que estén.

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

Espero que esto te ayude.

Puede hacerlo manualmente como si lo deseara.

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

Esta es la forma correcta de hacerlo.

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

php: // la entrada solo se puede leer una vez, y la clase de entrada CodeIgniter ya la habrá leído en este punto. –

+0

Simplemente agregue el tipo de contenido correcto al encabezado de su solicitud, 'Content-Type: application/json'. Como lo menciona Chris, Codeigniter lee la entrada antes de que se llame su método. – Shailesh

+0

Independientemente de lo que estén comentando, no tienen ninguna relación con la fecha en la que publiqué esta respuesta, que fue correcta en la fecha que publiqué. – CMCDragonkai

0

Sé que esto es una entrada antigua, pero para otros que buscan, esto podría ser útil:

En el lado del navegador, creo mi paquete de datos usando un código similar a este patrón:

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) 
    }; 

Luego, "publico" movimiento en el servidor. En el controlador, que a continuación, utiliza la siguiente lógica:

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

Sólo tiene que añadir el tipo de contenido correcto para su encabezado de la solicitud

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

Al utilizar $ this-> input-> que raw_input_stream puede leerlo varias veces y básicamente es lo mismo que file_get_contents ('php: // input'). Esto funciona en CI3. No sé si funciona en CI2.

0

La respuesta de Firze es correcta, pero aquí hay una respuesta más elaborada. No tengo permiso para comentar, así que lo estoy publicando como respuesta.

Tiene que ver con CodeIgniter que no puede obtener JSON. jQuery hace algunos trucos bajo el capó y transforma sus datos en form-data-x, es por eso que funciona cuando no especifica el content type, no codifica su objeto u otras situaciones.

Si quieres un puro JSON la solución es utilizar $this->input->raw_input_stream a buscar a su JSON y decodificarlo usando php 's json_decode. Compruebe la respuesta completa y el código de abajo:

Retrieve JSON POST data in CodeIgniter

2

Prueba este código, se dará salida a una matriz con todos sus parámetros.

$this->input->raw_input_stream; 

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

$input_data volverá gama

+0

Este enfoque me funciona. Gracias – tthreetorch

Cuestiones relacionadas