PHP cURL调用REST接口报searchColsCriteria字段不识别错误
问题场景
需要调用REST服务器,预期传入的JSON参数格式如下:
{"expand":"all", "offset":0, "limit":100, "searchColsCriteria": [ {"value":"577","column":"lookupValues_contextdept","operation":"="}, {"value":"0","column":"snapshot","operation":"="}, {"value":"0","column":"withdrawn","operation":"="}, {"value":"2019","column":"lookupValues_year","operation":">="}, {"value":"2021","column":"lookupValues_year","operation":"<="} ] }
对应的PHP cURL调用代码如下:
$data = array( 'offset' => 0, 'limit' => 100, 'expand' => 'none', 'searchColsCriteria' => '[{\"value\":\"577\",\"column\":\"lookupValues_contextdept\",\"operation\":\"=\"},{\"value\":\"0\",\"column\":\"snapshot\",\"operation\":\"=\"},{\"value\":\"0\",\"column\":\"withdrawn\",\"operation\":\"=\"},{\"value\":\"2019\",\"column\":\"lookupValues_year\",\"operation\":\">=\"},{\"value\":\"2021\",\"column\":\"lookupValues_year\",\"operation\":\"<=\"}]', ); $payload = json_encode($data); // Interrogo il webserevice con CURL passando i dati in POST $ch = curl_init('https://iris.univpm.it/rest/api/v1/public/items/search'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_USERPWD, "restadmin:XXXXXXXXX"); curl_setopt($ch, CURLINFO_HEADER_OUT, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $payload); // Setto HTTP Header per la POST request curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'cache-control: no-cache', 'Content-Length: ' . strlen($payload)) ); // Submit the POST request $result = curl_exec($ch); // Risposta del server /* per debug */ print_r($result); exit; curl_close($ch);
服务器返回错误:
Unrecognized field "searchColsCriteria" (class it.cineca.dspace4.rest.search.SearchSolrRestDTO), not marked as ignorable (5 known properties: "expand", "offset", "solrQuery", "limit", "sortingColsCriteria"]) at [Source: (org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream); line: 1, column: 63] (through reference chain: it.cineca.dspace4.rest.search.SearchSolrRestDTO["searchColsCriteria"])
错误原因
- 参数结构错误:
searchColsCriteria被定义为手动拼接的转义JSON字符串,而非PHP多维数组。json_encode处理后,该字段会被序列化为带引号的JSON字符串,而非服务器期望的JSON数组结构。 - 字段名称不匹配:当前服务器API的
SearchSolrRestDTO类中不存在searchColsCriteria字段,仅支持expand、offset、solrQuery、limit、sortingColsCriteria这几个字段,你提供的预期参数格式可能与API版本不兼容。
解决步骤
1. 修正参数数组结构
把searchColsCriteria改为PHP多维数组,让json_encode自动生成正确的JSON数组:
$data = array( 'offset' => 0, 'limit' => 100, 'expand' => 'all', // 若需要全量展开,建议和预期参数保持一致,从'none'改为'all' 'searchColsCriteria' => array( array( 'value' => '577', 'column' => 'lookupValues_contextdept', 'operation' => '=' ), array( 'value' => '0', 'column' => 'snapshot', 'operation' => '=' ), array( 'value' => '0', 'column' => 'withdrawn', 'operation' => '=' ), array( 'value' => '2019', 'column' => 'lookupValues_year', 'operation' => '>=' ), array( 'value' => '2021', 'column' => 'lookupValues_year', 'operation' => '<=' ) ) );
2. 匹配服务器要求的字段名
由于服务器不识别searchColsCriteria,需确认API文档中的正确字段名。根据错误信息中的solrQuery,这是Solr搜索常用的字段,可将条件转换为Solr查询语法传入:
$data = array( 'offset' => 0, 'limit' => 100, 'expand' => 'all', 'solrQuery' => 'lookupValues_contextdept:577 AND snapshot:0 AND withdrawn:0 AND lookupValues_year:[2019 TO 2021]' );
3. 验证请求格式
修正后可通过var_dump($payload)查看生成的JSON是否符合要求,确认结构无误后再发送请求。
4. 优化cURL代码(可选)
cURL会自动处理Content-Length,可手动移除该Header以避免计算错误:
curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'cache-control: no-cache' ));
内容的提问来源于stack exchange,提问作者Andrea Cappelli

