# Api开发---接口数据的添加和修改 > 注:由于这是入门级课程 在本章的api数据操作课程中 将忽略 权限验证 签名验证等 > [TOC] ### 我拿一段源码讲解一下 ~~~ public function applyEdit(){ header("Access-Control-Allow-Origin: *"); if($this->request->isPost()){ try{ $param_list =[ "company"=>"company/s", "address"=>"address/s", "contacts"=>"contacts/s", "jobs"=>"jobs/s", "mobile"=>"mobile/s", "tencent_code"=>"tencent_code/s", "desc"=>"desc/s", "event_key"=>"event_key/n", ]; $save_data = $this->buildParam($param_list); $save_data["originate"] = preg_replace('/http(s)?:\/\//',"",$this->request->server("HTTP_ORIGIN")); $save_data["open_id"] = $this->open_id; $validate_name = "base/system/SystemApply"; $model_name='base/system/SystemApply'; $result = $this->editData(false,$validate_name,$model_name,$save_data); if(isset($result["code"])){ if($result["code"]==1001){ $this->sendMessageToAdmin($save_data); } } return json($result); }catch (Exception $e){ Log::error($e->getMessage()); return self::showJsonReturnCodeWithOutData(1008,$e->getMessage()); } }else{ return self::showJsonReturnCodeWithOutData(1002); } } ~~~ ### 首先 我在代码的前段增加允许跨域的代码 ~~~ header("Access-Control-Allow-Origin: *"); ~~~ >[danger] 你可以修改"*"为允许跨域的域名 ### 我这里增加了只允许post方式提交数据 ~~~ f($this->request->isPost()){ //post提交 处理数据主代码 }else{ //get方式 渲染提交页面 return self::showJsonReturnCodeWithOutData(1002); } ~~~ ### 在主程序中try catch获取异常 保证接口稳定性及记录错误日志 ~~~ try{ // 处理数据主代码 }catch (Exception $e){ Log::error($e->getMessage()); return self::showJsonReturnCodeWithOutData(1008,$e->getMessage()); } ~~~ PS:如果单单是接口 完全可以省略上一步的post判断,只需要判断非post提交抛出异常即可 ### 使用基类方法buildParam接收数据 ~~~ $param_list =[ "company"=>"company/s", "address"=>"address/s", "contacts"=>"contacts/s", "jobs"=>"jobs/s", "mobile"=>"mobile/s", "tencent_code"=>"tencent_code/s", "desc"=>"desc/s", "event_key"=>"event_key/d", ]; $save_data = $this->buildParam($param_list); ~~~ buildParam方法源码参见前面课程 >[danger] 在$param_list数组中 数组的键值为你数据库字段 数组的value值为接口接收时的字段 大家会发现 在值中 会有一个斜杠加上字符 如 /s /d 这个是强制转换 这个就是第一层的数据验证保护 不能忽略 常用的一般为 /s /d ThinkPHP5.0版本默认的变量修饰符是/s,如果需要传入字符串之外的变量可以使用下面的修饰符,包括: | 修饰符号 | 转换结果 | | --- | --- | | /s | 强制转换为字符串类型 | | /d | 强制转换为整型类型 | | /b | 强制转换为布尔类型 | | /a | 强制转换为数组类型 | | /f | 强制转换为浮点类型 | >[danger] 如果你要获取的数据为数组,请一定注意要加上 /a 修饰符才能正确获取到。否则报错. ### 附加要保存的数据 (根据程序需要 可选部分) ~~~ $save_data["originate"] = preg_replace('/http(s)?:\/\//',"",$this->request->server("HTTP_ORIGIN")); $save_data["open_id"] = $this->open_id; ~~~ 这里 originate 是用户的来源网址 open_id 为基类中获取到的用户身份信息 ### 定义验证类和模型类 使用editData方法保存数据 ~~~ $validate_name = "base/system/SystemApply"; $model_name='base/system/SystemApply'; $result = $this->editData(false,$validate_name,$model_name,$save_data); ~~~ >[danger] 注意 我这里使用了模型分层和验证器的分层 其中验证器的分层 要git最新的TP5源码才不会报错,其中版本5.0.11及以下都会报错的 > 另:editData源码参见前面课程 ### 判断返回值 进行特殊处理 (根据程序需要 可选部分) ~~~ if(isset($result["code"])){ if($result["code"]==1001){ $this->sendMessageToAdmin($save_data); } } return json($result); ~~~ 如果 不需要额外处理什么 直接返回 editData结果即可 ~~~ return $this->editData(false,$validate_name,$model_name,$save_data); ~~~ 其实这样就可以了 ### 另外 该方法同样适用数据修改 $param_list 数组中 只要添加了主键字段 editData方法就会执行修改操作 > 附录: > 模型和控制器的建立 > 参加TP5实战开发前篇 >[info] 控制器基类之控制器基类常用方法 > https://www.kancloud.cn/mikkle/thinkphp5_study/378509 >[info] 模型基类之常用数据处理方法 > https://www.kancloud.cn/mikkle/thinkphp5_study/381920 >[danger] EditData快捷类库的使用方法 >https://www.kancloud.cn/mikkle/thinkphp5_study/462693 使用独立的修改类库 推荐使用 ~~~ $paramList = [ "company" => "company/s", "address" => "address/s", "contacts" => "contacts/s", "jobs" => "jobs/s", "mobile" => "mobile/s", "tencent_code" => "tencent_code/s", "desc" => "desc/s", "event_key" => "event_key/n", ]; $validate_name = "base/system/SystemApply"; $model_name = 'base/system/SystemApply'; $re = EditData::instance() ->setParameter($paramList) ->setAppend(["append" => "this is append"]) ->setValidate($validate_name) ->setModel($model_name) ->save();; return $re ? ReturnCode::jsonCode(1001) : ReturnCode::jsonCode(1003); ~~~