使用CURL進行JSON檔案POST

送出到Server的Json資料由於是放在Body中傳送,因此,必須要轉換成字串形式送出,因此需要先使用 json_encode進行編碼。

function Json2DB($data) {
      global $m_APIServer, $_errMsg;
      // 取得遠端TOKEN認證
      if(!($token = ApiGetToken())) { $_errMsg .= "Get token error.";  return false; }

      $url = "{$m_APIServer}coursehours/points";
      $authorization = "Authorization: Bearer $token[token]";

      ParseJsonDefault($data);  // 轉換格式
      $c = curl_init();
      curl_setopt($c, CURLOPT_TIMEOUT, 30);
      curl_setopt($c, CURLOPT_HTTPHEADER, array('Content-Type: application/json' ,$authorization));
      curl_setopt($c, CURLOPT_URL, $url);
      curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($c, CURLOPT_POST, true); // Specify the request method as POST
      curl_setopt($c, CURLOPT_POSTFIELDS, json_encode($data));
      $result = curl_exec($c); // Execute the cURL statement
      if(!$result) $_errMsg = curl_error($c);
      else if($result == "502 Bad Gateway") $_errMsg = "API 服務未啟動(502)";
      curl_close($c);
      return $result;
   }

格式轉換

json 格式需要把數字欄位轉化成數字,以免Server端採用對資料型態嚴謹的程式開發時,會造成錯誤。若有必要,可以使用:JSON_NUMERIC_CHECK 當json_encode 第二個參數。

function ParseJsonDefault(&$vals) {
      foreach($vals as $idx=>$obj) {
         foreach($obj as $key=>$val) {
            if($key == 'certified_hour' || $key == 'year') {
               if(empty($val) || $val == "") $vals[$idx]->$key = 0;
               else $vals[$idx]->$key = intval($val);
            }
            else if($key == 'category_title') { if(empty($val))  $vals[$idx]->$key = ""; }
         }
      }
   }