iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 21
0

上次我們終於完成自訂API的部分,然而還有一點小問題,我們似乎沒有特別限制API到底是用GET還是POST,所以這次我們要來解決這個問題。

首先問題的源頭在於controllers/Api.php裡面的get_post_data,這個函式是會抓取目前所有的GET與POST資料並且回傳回去,接下來我們就從這裡開始動手。

我們打開config/routes_api.php檔案進行修改:

!#原始
<?php 
  $config['routes_api'] = array(
    'user'=> array(
      'get_user'=> 'get_user'
    )
  );
?>
!#修改後
<?php 
  $config['routes_api'] = array(
    'user'=> array(
      'get'=> array(
        'get_user'=> 'get_user'
      ),
      'post'=> array()
    )
  );
?>

如此一來就能分辨到底是get還是post了,接著回到controllers/Api.php找到check_api_file加以改寫:

  function check_api_file($path_name, $func_name) {
    // 取得API清單
    $routes = $this->config->item('routes_api');
    // 確認是否有指定的API路徑與資料
    if (isset($routes[$path_name]) && (isset($routes[$path_name]['get'][$func_name]) || isset($routes[$path_name]['post'][$func_name]))) {
      if (isset($routes[$path_name]['get'][$func_name])) {
        // 有此API可以進行接下來動作
        $json_arr = $this->mod_config->msgResponse((isset($json_arr))?$json_arr:array(), 'success', 'GET_DATA_SUCCESS', $this->language);
        $json_arr['path'] = $path_name;
        $json_arr['func'] = $routes[$path_name]['get'][$func_name]; // 取得名稱
        $json_arr['type'] = 'get'; // 傳輸方法
      } else if (isset($routes[$path_name]['post'][$func_name])) {
        // 有此API可以進行接下來動作
        $json_arr = $this->mod_config->msgResponse((isset($json_arr))?$json_arr:array(), 'success', 'GET_DATA_SUCCESS', $this->language);
        $json_arr['path'] = $path_name;
        $json_arr['func'] = $routes[$path_name]['post'][$func_name]; // 取得名稱
        $json_arr['type'] = 'post'; // 傳輸方法
      } else {
        // 找不到API,回報錯誤
        $json_arr = $this->mod_config->msgResponse((isset($json_arr))?$json_arr:array(), 'error', 'DATA_FAIL', $this->language);
      }
    } else {
      // 找不到API,回報錯誤
      $json_arr = $this->mod_config->msgResponse((isset($json_arr))?$json_arr:array(), 'error', 'DATA_FAIL', $this->language);
    }
    return $json_arr; // 回傳結果
  }

透過上面方法能過辨識get or post兩種方法並傳輸回去,告訴authenticate確認有此API與他的方法是什麼,我們在取得資料中一段加入類型參數:

$get_post_image_data = array_merge($get_post_image_data, $this->get_post_data($auth['type']));

接著到下方的get_post_data加入:

  // 取得傳輸進來的資料
  function get_post_data($type) {
    if ($type == 'get') {
      return $this->input->get();
    } else if ($type == 'post') {
      return $this->input->post();
    } else {
      return array();
    }
  }

接著我們透過POSTMAN測試,因為我們設定get_userGET方式,當我們使用POST方法時:
POST測試

他就無法確實抓到資料,但是當我們使用GET傳輸時:
GET測試

如此一來就能就過此方法辨認是否使用正確的方法或是參數了呢!

Next station ... 通用Models


上一篇
[Day20] 改造API Part5
下一篇
[Day22] 通用Models (上)
系列文
你說Codeigniter還能怎麼做?30

尚未有邦友留言

立即登入留言