PHP CURL与Postman调用接口传参后仍报district Id is required问题
接口调用异常排查记录
调用 https://hrtaskapi.dhwaniris.in/index.php/api/beneficiary/child-profile-create 接口执行数据插入操作时,无论传参完整度如何,接口始终返回「district Id is required」报错,问题持续3天未定位根因,已完成的排查动作如下:
- 已留存Postman调用的对应截图记录,关联的Postman调用参数集合已同步留存
- 接口校验规则要求请求头携带名为
token的API密钥,已验证的合法token值示例为:eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjQ3IiwidW5pcXVlX3VzZXJfaWQiOiIxMTg4IiwibmFtZSI6IkJhcm1lciBTb3V0aCBDb29yZGluYXRvciIsInVzZXJuYW1lIjoiMjA0MCIsIm1vYmlsZSI6Ijk5OTk5OTk5OTkiLCJsZXZlbF9pZCI6IjUiLCJwYXNzd29yZF9yZXNldF90b2tlbiI6bnVsbCwiZW1haWwiOiJhYmNuZ0BnbWFpbC5jb20iLCJhdXRoX2tleSI6ImQ0MWQ4Y2Q5OGYwMGIyMDRlOTgwMDk5OGVjZjg0MjdlIiwic3RhdHVzIjoiMSIsImNyZWF0ZWRfYXQiOiIwMDAwLTAwLTAwIDAwOjAwOjAwIiwidXBkYXRlZF9hdCI6IjIwMTktMTEtMDYgMDc6MTg6MDQiLCJjaGFuZ2VkX3Bhc3N3b3JkX29uY2UiOm51bGwsInVzZXJfZXJyb3JfZnJlcXVlbmN5XzEiOm51bGwsInVzZXJfZXJyb3JfZnJlcXVlbmN5XzIiOiIxOCIsInVzZXJfbGV2ZWwiOiJDbHVzdGVyIFN1cGVydmlzb3IiLCJsb2dpbl9pZCI6M30.ak3OSYopsW211SvJnzH4nNLvcj9Z4B16fR329fZbHeA - 已尝试通过PHP CURL分别使用POST、PUT请求方法调用接口,问题仍未解决。所用CURL代码如下:
上述CURL请求的返回结果为:$curl = curl_init(); curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, "district_id=1"); curl_setopt($curl, CURLOPT_URL, "https://hrtaskapi.dhwaniris.in/index.php/api/beneficiary/child-profile-create"); curl_setopt($curl, CURLOPT_HTTPHEADER, array( 'token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEwMTEiLCJ1bmlxdWVfdXNlcl9pZCI6IjEwMTEiLCJuYW1lIjoiU3dhdGkgU29tYW5pIiwidXNlcm5hbWUiOiIxNDEyIiwibW9iaWxlIjoiNjM3NzE0NzU3MiIsImxldmVsX2lkIjoiNSIsInBhc3N3b3JkX3Jlc2V0X3Rva2VuIjoiMTQyNDg3IiwiZW1haWwiOiJzd2F0aXNvbWFuaTk1QGdtYWlsLmNvbSIsImF1dGhfa2V5IjoiZDQxZDhjZDk4ZjAwYjIwNGU5ODAwOTk4ZWNmODQyN2UiLCJzdGF0dXMiOiIxIiwiY3JlYXRlZF9hdCI6IjAwMDAtMDAtMDAgMDA6MDA6MDAiLCJ1cGRhdGVkX2F0IjoiMjAxOS0xMC0xNSAwNzowNjoxMiIsImNoYW5nZWRfcGFzc3dvcmRfb25jZSI6bnVsbCwidXNlcl9lcnJvcl9mcmVxdWVuY3lfMSI6bnVsbCwidXNlcl9lcnJvcl9mcmVxdWVuY3lfMiI6IjMiLCJ1c2VyX2xldmVsIjoiQ2x1c3RlciBTdXBlcnZpc29yIiwibG9naW5faWQiOjR9.jDfocuaZhPcTyefEm-ZH-VOdPEsUdc-r8-bdAW-MJwI', 'Content-Type: application/json', )); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); $result = curl_exec($curl); curl_close($curl); echo "<pre>"; print_r(json_decode($result));stdClass Object ( [success] => [status] => 200 [message] => district Id is required ) - 已使用相同token调用同域下的
https://hrtaskapi.dhwaniris.in/index.php/api/beneficiary/get-child-profile接口,接口可正常返回数据,返回结果中明确标注合法的district_id取值为1:stdClass Object ( [success] => 1 [status] => 200 [message] => Child Profile Detail [timestamp] => 1614518328 [child_profile] => Array ( [0] => stdClass Object ( [id] => 51 [name] => Laxmi [sex] => 2 [dob] => 2014-04-02 [father_name] => Kishansingh [mother_name] => Uddi [district_id] => 1 [photo] => https://staging-dhwani.s3.ap-south-1.amazonaws.com/82ac44b1c5d7ef91a9e912abca5fc3f5.jpg ) [1] => stdClass Object ( [id] => 52 [name] => Laxmi [sex] => 2 [dob] => 2012-11-07 [father_name] => Vinod nath [mother_name] => Babli bai [district_id] => 1 [photo] => https://staging-dhwani.s3.ap-south-1.amazonaws.com/82ac44b1c5d7ef91a9e912abca5fc3f5.jpg ) ) )
已确认传入的district_id=1为合法取值,但服务端始终识别不到该参数,核心排查方向与解决方案如下:
可落地排查与修复方案
- 请求体格式不匹配是最高概率根因
代码中已将请求头Content-Type设置为application/json,但通过CURLOPT_POSTFIELDS传入的是district_id=1格式的表单字符串——这种传值方式仅适配application/x-www-form-urlencoded格式的请求,在JSON格式头声明下,服务端不会将该字符串解析为有效参数,最终就会出现“参数已传但校验识别不到”的问题。
修复方式:将待传参数转换为JSON字符串后再提交,示例代码:$postData = json_encode(['district_id' => 1]); curl_setopt($curl, CURLOPT_POSTFIELDS, $postData); - 核对参数嵌套层级要求
同类业务接口的常见实现逻辑中,district_id通常不是直接放在请求体根层级,而是嵌套在用户档案、关联主体的子对象中。可对照同域get接口的返回结构,将district_id放在对应嵌套层级内传参,避免因层级不符被校验逻辑跳过。 - 校验参数命名格式匹配度
报错提示文案为「district Id is required」,和实际传的district_id命名存在格式差异,需核对接口要求的参数名是否为districtId、districtid等其他命名变体,避免因命名格式偏差被判定为参数缺失。 - 排查中间件拦截影响
临时移除代码中无关的CURLOPT_HTTPAUTH = CURLAUTH_BASIC配置,部分服务端的基础认证中间件会对携带基础认证头的请求做参数解析拦截,导致常规POST参数无法被正常读取。
内容的提问来源于stack exchange,提问作者Shubham Jha
相关产品推荐
相关产品推荐

