2011-04-04 12 views
8

Tengo un problema en este momento con CodeIgniter: Yo uso el REST Controller library (que es realmente impresionante) para crear una API, pero no puedo llegar a poner las solicitudes ...obtener una solicitud PUT con CodeIgniter

Este es mi código :

function user_put() { 
    $user_id = $this->get("id"); 
    echo $user_id; 
    $username = $this->put("username"); 
    echo $username; 
} 

utilizo rizo para realizar la solicitud:

curl -i -X PUT -d "username=test" http://[...]/user/id/1 

el user_id es completa, pero la variable de nombre de usuario está vacía. Sin embargo, funciona con los verbos POST y GET. ¿Tienes alguna idea por favor?

¡Gracias!

+0

Hey @Shatter ¿alguna vez tienen la oportunidad de validar este? – jcolebrand

+0

Aún con errores, $ this-> put ('anything') devuelve false – Syl

Respuesta

10

De acuerdo con: http://net.tutsplus.com/tutorials/php/working-with-restful-services-in-codeigniter-2/ debemos consultar https://github.com/philsturgeon/codeigniter-restserver/blob/master/application/libraries/REST_Controller.php#L544 ver que este método:

/** 
* Detect method 
* 
* Detect which method (POST, PUT, GET, DELETE) is being used 
* 
* @return string 
*/ 
protected function _detect_method() { 
    $method = strtolower($this->input->server('REQUEST_METHOD')); 

    if ($this->config->item('enable_emulate_request')) { 
    if ($this->input->post('_method')) { 
     $method = strtolower($this->input->post('_method')); 
    } else if ($this->input->server('HTTP_X_HTTP_METHOD_OVERRIDE')) { 
     $method = strtolower($this->input->server('HTTP_X_HTTP_METHOD_OVERRIDE')); 
    }  
    } 

    if (in_array($method, array('get', 'delete', 'post', 'put'))) { 
    return $method; 
    } 

    return 'get'; 
} 

mira para ver si hemos definido la cabecera HTTP HTTP_X_HTTP_METHOD_OVERRIDE y usos que a favor del verbo real que hemos implementado en la web. Para utilizar esto en una solicitud, debe especificar el encabezado X-HTTP-Method-Override: method (por lo tanto, X-HTTP-Method-Override: put) para generar un reemplazo de método personalizado. A veces, el marco espera X-HTTP-Method en lugar de X-HTTP-Method-Override por lo que esto varía según el marco.

si estuviera haciendo una solicitud de este tipo a través de jQuery, que integraría este trozo en su solicitud ajax:

beforeSend: function (XMLHttpRequest) { 
    //Specify the HTTP method DELETE to perform a delete operation. 
    XMLHttpRequest.setRequestHeader("X-HTTP-Method-Override", "DELETE"); 
} 
-1

CodeIgniter no admite la lectura de solicitudes PUT entrantes y, si no es esencial, me quedaré con GET/POST para su API ya que probablemente no sea necesario.

Si necesita leer las solicitudes PUT eche un vistazo a Accessing Incoming PUT Data from PHP.

+0

Esto puede haber sido exacto en abril de 2011, pero actualmente no es exacto. – jcolebrand

2

Usted puede tratar de detectar primero el tipo de método y separar los diferentes casos. Si su controlador solo maneja las funciones REST, podría ser útil colocar la información requerida en el constructor.

switch($_SERVER['REQUEST_METHOD']){ 
    case 'GET': 
     $var_array=$this->input->get(); 
     ... 
     break; 
    case 'POST': 
     $var_array=$this->input->post(); 
     ... 
     break; 
    case 'PUT': 
    case 'DELETE': 
     parse_str(file_get_contents("php://input"),$var_array); 
     ... 
     break; 
    default: 
     echo "I don't know how to handle this request."; 
} 
Cuestiones relacionadas