Call API方式

如果你一個網站有很多個模組,有時候你可能會需要跨模組去call API有時候會需要call自己的API,以下我只是就我經歷過的專案來做介紹。

如果我們有很多個模組API要管理的話,我會在\app\Services\這底下建立不同的模組service,分別管理不同模組要call的API,像是我們iscar專案有很多個模組(ex:member、pm、brand、app、temple...等等),所以就會有不同的service來管理我要去那個模組call API的function。

以下是memberservice的一小部分,看看就好。

<?php
namespace App\Services;

define('QueryMember', config('global.query_member'));
define('ModifyMember', config('global.modify_member'));
define('Modacc', config('global.modacc'));
define('Modvrf', config('global.modvrf'));

class MemberService {

    /**
     * call member模組的API [QueryMember]
     * @param  [type] $md_mobile      [會員手機號碼]
     * @param  [type] $md_contactmail [會員電子信箱]
     * @global route  QueryMember     [member模組的API]
     * @global string Modacc          [模組帳號]
     * @global string Modvrf          [模組驗證碼]
     */
    public function callApiQueryMember($md_mobile,$md_contactmail){
        // 編輯要call API所需要傳入的值
        $arraydata['md_mobile'] = $md_mobile;
        $arraydata['md_contactmail'] = $md_contactmail;
        $arraydata['modacc'] = Modacc;
        $arraydata['modvrf'] = Modvrf;
        $url = QueryMember;
        // call API
        $request = \App\Library\CommonTools::curlModule($arraydata,$url);
        $request = $request['query_memberresult'];
        return $request;
    }

    /**
     * call member模組的API [ModifyMember]
     * @param  [type] $md_id          [會員代號]
     * @param  [type] $md_clienttype  [會員類型]
     * @global route  ModifyMember    [member模組的API]
     * @global string Modacc          [模組帳號]
     * @global string Modvrf          [模組驗證碼]
     */
    public function callApiModifyMember($md_id,$md_clienttype){
        // 編輯要call API所需要傳入的值
        $arraydata['md_id'] = $md_id;
        $arraydata['md_clienttype'] = $md_clienttype;
        $arraydata['modacc'] = Modacc;
        $arraydata['modvrf'] = Modvrf;
        $url = ModifyMember;
        // call API
        $request = \App\Library\CommonTools::curlModule($arraydata,$url);
        $request = $request['modify_memberresult'];
        return $request;
    }

}

上面的arraydata變數就是你api所需要傳入的值得陣列,然後url就是你要call的那隻api的route

然後大家應該會看到了我call API的方式是用Curl,cURL是一個利用URL語法在命令列下工作的檔案傳輸工具。

以下是我call API的curl function

/**
 * Curl模組化使用
 * @param type array $post 傳送資料
 * @param type string $route 傳送route
 * @return array or null
 */
public static function curlModule ($post, $route){
    try {
        $curl = curl_init();
        curl_setopt_array($curl, array(
            CURLOPT_URL => $route,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "POST",
            CURLOPT_POSTFIELDS => json_encode(json_encode($post)),
            CURLOPT_HTTPHEADER => array(
              "cache-control: no-cache",
              "content-type: application/json",
            ),
        ));
        $response = curl_exec($curl);
        $err = curl_error($curl);
        curl_close($curl);
        if ($err) {
            throw new \Exception($err);
        } else {
            // 將得到的回應(json字串)轉成陣列
            return \App\library\CommonTools::ConvertStringToArray($response);
        }
    } catch(\Exception $ex) {
        CommonTools::writeErrorLogByException($ex);
        return false;
    }
}

這樣就大功告成了喔。

Last updated