CKAN API调用datastore_search时filters含分号报JSON解析错误如何解决
问题根因
报错并非CKAN的JSON解析逻辑不支持分号,核心原因是未做URL编码的;会被CKAN依赖的Web框架识别为查询参数分隔符(优先级和&一致),导致后端实际接收到的filters参数是被截断的残缺JSON,最终触发解析失败。
解决方案
- 对filters参数做标准URL编码
URL查询串中的所有特殊字符都需要做百分号编码,;对应的编码值为%3B,编码后不会再被框架误判为参数分隔符。
编码后的可正常执行的请求示例:
开发时不要手动拼接URL参数,直接使用所用编程语言HTTP库自带的参数构造能力,库会自动完成所有特殊字符编码,从根源避免这类问题。以Python requests库为例:https://dados.uffs.edu.br/api/3/action/datastore_search?resource_id=75eb15ab-c30f-4c40-8c19-a5bf936a0aa5&filters=%7B%22coordenador%22%3A%22te%3Bst%22%7Dimport requests api_endpoint = "https://dados.uffs.edu.br/api/3/action/datastore_search" params = { "resource_id": "75eb15ab-c30f-4c40-8c19-a5bf936a0aa5", "filters": {"coordenador": "te;st"} } resp = requests.get(api_endpoint, params=params) - 改用POST请求传参
如果GET请求经过网关、反向代理时仍存在特殊字符拦截问题,可直接改用POST方式调用接口,将所有参数放在JSON格式的请求体中传输,完全绕开URL参数解析的特殊字符限制。请求示例:curl -X POST https://dados.uffs.edu.br/api/3/action/datastore_search \ -H "Content-Type: application/json" \ -d '{"resource_id":"75eb15ab-c30f-4c40-8c19-a5bf936a0aa5","filters":{"coordenador":"te;st"}}'
内容的提问来源于stack exchange,提问作者Rodrigo R
相关产品推荐
相关产品推荐

