2015-12-16 3 views
0

Я использую codeigniter для создания api rest с библиотекой, которая предоставляет официальный веб-сайт.API REST не работает.

Проблема заключается в том, что файл routes.php не перенаправляется хорошо. Когда я положил localhost/API/1 в мой браузер вызывает ошибку 404.

Вот мой контроллер "Apicontroller":

public function __construct() { //constructor //no tocar 
    parent::__construct(); 
    $this -> load -> model("Modelocontrolador"); 
} 

public function index_get() { //get all the info 
    $datos_devueltos = $this->Modelocontrolador->getPrueba(NULL, "Usuarios"); 

    if(!is_null($datos_devueltos)){ 
     $this->response(array("response" => $datos_devueltos), 200); 
    }else{ 
     $this->response(array("response" => "No date"), 200); 
    } 
} 
public function find_get($id){ //select where 
    $datos_devueltos = $this->Modelocontrolador->getPrueba($id, "Usuarios"); 
    if($id != NULL){ 
     if(!is_null($datos_devueltos)){ 
      $this->response(array("response" => $datos_devueltos), 200); 
     }else{ 
      $this->response(array("response" => "No date"), 200); 
     } 
    }else{ 
     $this->response(array("response" => "No dates for search"), 200); 
    } 
} 

public function index_post() { //insert in la table 
    if(! $this -> post("dato")){ 
     $this->response(array("response" => "No enought info"), 200); 
    }else{ 
     $datoID = $this -> Modelocontrolador -> save($this -> post("dato"),"UsuariosJJ"); 

     if(!is_null($datoID)){ 
      $this->response(array("response" => $datoID), 200); 
     }else{ 
      $this->response(array("response" => "No found it"), 200); 
     } 
    } 
} 
public function index_put($id) { //"update" 
    if(! $this -> post("dato") || ! $id){ 
     $this->response(array("response" => "No ha mandado informacion correcta para el update"), 200); 
    }else{ 
     $datoID = $this -> Modelocontrolador -> update("Uid",$id,$this -> post("dato"),"UsuariosJJ"); 

     if(!is_null($datoID)){ 
      $this->response(array("response" => "Dato actualizado"), 200); 
     }else{ 
      $this->response(array("response" => "Error modify"), 200); 
     } 
    } 

} 
public function index_delete($id) { 
    if(! $id){ 
     $this->response(array("response" => "Not enought info"), 200); 
    }else{ 
     $delete = $this-> Modelocontrolador -> delete("Uid",$id,"UsuariosJJ"); 
    } 

    if(!is_null($delete)){ 
     $this->response(array("response" => "Date delete"), 200); 
    }else{ 
     $this->response(array("response" => "Error delete"), 200); 
    } 

}} 

И мой маршруты файл:

$route['default_controller'] = 'Apicontroller'; 
$route['404_override'] = ''; 
$route['translate_uri_dashes'] = FALSE; 

/*sub-rutas*/ 
/*---------*/ 
$route["Apicontroller"]["get"] = "Apicontroller/index"; //basico 
$route["Apicontroller/(:num)"]["get"] = "Apicontroller/find"; //select 
$route["Apicontroller"]["post"] = "Apicontroller/index"; //insert 
$route["Apicontroller/(:num)"]["put"] = "Apicontroller/index/$1"; //update 
$route["Apicontroller/(:num)"]["delete"] = "Apicontroller/index/$1"; //delete 

ответ

0

Если запрос браузер буквально использует /API затем маршрутизации потребности в 'увидеть' именно это. Кроме того, правила маршрута должны быть явными при вызове метода. (Надеюсь, приведенный код отражает сопоставление, которое вы имели в виду.)

Используя приведенные выше маршруты, я создал тестовый код. Вот эти файлы.

Очень упрощенный Apicontroller.

class Apicontroller extends CI_Controller 
{ 
    function __construct() 
    { 
    parent::__construct(); 
    } 

    function index_get() 
    { 
    echo "API index"; 
    } 

    public function find_get($id) 
    { //select where 
    echo "API find_get $id"; 
    } 

    public function index_post() 
    { 
    echo 'API index_post'; 
    } 

    public function index_put($id) 
    { //"update" 
    echo "API put $id"; 
    } 
} 

Я не верю, что, поскольку ваш Apicontroller расширяет другой класс, результаты будут меняться. Это может быть решительным предположением.

Чтобы проверить POST-вызовы, я использовал эти два файла. Первый контроллер Testpost.php

class Testpost extends CI_Controller 
{ 
    public function __construct() 
    { 
    parent::__construct(); 
    $this->load->helper('form'); 
    } 

    public function index() 
    { 
    $this->load->view("test"); 
    } 

} 

Очень простой вид (test.php) загружен выше.

<?php 
echo form_open("API"); 
echo form_submit('mysubmit', 'Submit Post!'); 
echo form_close(); 

Направляя браузер LOCALHOST/testpost показывает страницу с одной кнопки отправки. При нажатии на кнопку появляется экран с текстом «API index_post».

Отправка браузера к localhost/API/3 создает экран с текстом «API find_get 3».

localhost/API производит «индекс API».

Теперь интересная вещь (не связанная с вашей проблемой, но интересная).

Учитывая по умолчанию

$route['default_controller'] = 'Apicontroller'; 

и маршрут

$route["API"]["get"] = "Apicontroller/index_get"; 

Я ожидал, что направляя браузер на главную страницу локальный будет производить "индекс API". Но это не так. Это приводит к 404.Из-за такого поведения было бы целесообразно, чтобы быть более явным с default_controller

$route['default_controller'] = 'Apicontroller/index_get'; 

Или добавить index() функцию Apicontroller, которая вызывает $this->index_get().

Я не тестировал PUT или DELETE, так как мой сервер не настроен для их обработки. Но, как GET и POST, похоже, функционируют, в праведном мире они будут работать.

+0

извините, не работала, та же ошибка: –

+0

Ошибка 404 локальный Apache/2.4.16 (Unix) OpenSSL/1.0.1p PHP/5.6.12 mod_perl/2.0.8-DEV Perl/v5. 16.3 –

+0

Является ли первая строка контроллера похожим на этот класс? Apicontroller расширяет CI_Controller {'? И это называется (с учетом регистра) Apicontroller.php? И это находится в папке 'application/controllers /? – DFriend

0

похоже, что вы используете библиотеку REST_Controller от PHIL с CI 2.x, правильно?

Если да, то я бы рекомендовал вам использовать то, что я хотел бы назвать «индекса шлюз», потому что вы не можете сделать в-метод маршрутизации с CI2:

class Apicontroller extends REST_Controller 
{ 
    function index_gateway_get($id){ 
    $this->get_get($id); 
    } 

    function index_gateway_put($id){ 
    $this->put_put($id); 
    } 

    // This is not a "gateway" method because POST doesn't require an ID 
    function index_post(){ 
    $this->post_post(); 
    } 

    function get_get($id = null){ 
    if(!isset($id)){ 
     // Get all rows 
    }else{ 
     // Get specific row 
    } 
    } 

    function put_put($id = null){ 
    if(!isset($id)){ 
     // a PUT withtout an ID is a POST 
     $this->post_post(); 
    }else{ 
     // PUT method 
    } 
    } 

    function post_post(){ 
    // POST method 
    } 
} 

маршрутизации, чтобы эта работа действительно легко:

$route["API/(:num)"] = "Apicontroller/index_gateway/$1"; 

Это все, что вам нужно. Библиотека REST Рифа будет перенаправлена ​​на правильный index_gateway_HTTPMETHOD в зависимости от того, какой метод используется. Каждый index_gateway_HTTPMETHOD затем перенаправляет на правильный метод.

Насколько я знаю, этот трюк - единственный способ использовать CI2 единую/API/точку входа, которая работает для всех HTTP-методов.

 Смежные вопросы

  • Нет связанных вопросов^_^