




PHP模拟POST请求前必须主动校验参数:若后端用$_POST,需检查必填字段、字符串长度、数字范围,并设置application/x-www-form-urlencoded;若用json_decode(file_get_contents('php://input')),则需校验JSON结构、字段存在性及数据类型,并设application/json;cURL发送前须完成字段存在性、类型格式、JSON编码三重校验;Guzzle应封装validateApiRequest()函数预检,避免不可序列化数据。
直接用 file_get_contents() 或 cURL 发起 POST 请求本身不带参数校验逻辑——校验必须由你主动加在请求发出前。否则后端返回 400 或空响应,你根本不知道是字段漏了、类型错了,还是 JSON 格式崩了。
后端接收方式不同,前端模拟的格式和校验策略就得跟着变:
$_POST(表单提交),你得用 application/x-www-form-urlencoded 或 multipart/form-data,参数是键值对,校验重点在必填字段、字符串长度、数字范围json_decode(file_get_contents('php://inp
ut'))(JSON API),你得发 application/json,body 是 JSON 字符串,校验重点在结构完整性、字段存在性、数据类型(比如 "id": 123 不能传成 "id": "123")$_POST 为空、php://input 解析失败,后端连日志都打不出有效错误别等 response 返回再查问题。在调用 curl_exec() 前,把这三步走完:
isset() 或 array_key_exists() 确保所有必填 key 都在请求数组里,比如 ['username', 'email', 'password']
filter_var($email, FILTER_VALIDATE_EMAIL),手机号用正则,数字字段用 is_int() 或 ctype_digit()(注意字符串数字)json_encode($data) 返回是否为 false,并用 json_last_error_msg() 定位问题(常见于 NaN、资源句柄、循环引用)Guzzle 本身不校验入参,但你可以用中间件或封装一层函数来卡住非法数据:
validateApiRequest() 函数,接收原始参数数组和规则数组(如 ['name' => 'required|string|max:50']),内部用 filter_var / 正则 / strlen 手动比对$client->post('/api/login', ['json' => $rawData]),先过一遍校验,失败就 throw 新的 InvalidArgumentException,消息里带具体字段名json 选项会自动 json_encode,所以你传进去的数组不能含不可序列化项(比如 Closure、resource),否则静默失败或报错 Serialization of 'Closure' is not allowed
form_params,这时候后端收不到数据,而你还在查 PHP 错误日志有没有 warning。