3

我正在尝试调用 Census 微数据 API,但在推荐的库(Drakma 和 Dexador)中的 URL 格式存在问题。为了返回表格结果,人口普查 API 调用非标准(也许?)编码:带有“+”的查询不应切换为“%2B”,而“表格命令”则完全编码为 % 编码。例如:

https:.../acs5/pums?tabulate=weight(PWGTP)&col+AGEGROUP&recode+AGEGROUP="tabulate commands here"
;;; where "tabulate commands" look like {"b":AGEP,"d":[[0,1,2,3],[{"mn":4,"mx":99}]]} before encoding
;;; and alphabet soup after.

请参阅人口普查微数据 API 文档

如果我将上述内容包装在 Drakma 或 Dexador/Quri 中以发出 http 请求,它会使用编码的“制表命令”(“%7B%22b%22%3A%22AGEP%22...”等)对整个 URL 进行编码。 ) 被人口普查 API 接受,但同时创建了 "...col%2BAGEGROUP..." 和 "...recode%2BAGEGROUP...",人口普查 API 会阻塞(返回错误的查询错误)。

如果我手动将输出 URL 编辑回 '..col+AGEGROUP..' 和 '...recode+AGEGROUP...' 并将其粘贴到浏览器中,它可以工作。那么,有没有办法防止'+'字符转换?一般来说,我对网络工作的深度不够,所以如果这个问题不清楚,我深表歉意。

直接调用完全编码工作正常;似乎特别是表格查询中涉及的“+”命名变量会引起麻烦。(请注意,此示例提取了很多条目):

(dex:get (quri:make-uri
           :defaults "https://api.census.gov/data/2019/acs/acs5/pums"
           :query '(("get" . "NP")
                    ("for" . "state:01"))))

(旁注——我不能像在 Drakma 中那样将参数/查询直接传递给 Dexador 的“GET”方法,这似乎很奇怪。我是否遗漏了一些明显的东西?)

或者,我可以使用自己的编码器,对我需要编码的部分进行编码(“在此处重新编码命令”),然后将 dex 网址作为字符串传递——这行得通!但似乎很脆弱,因为我没有对大部分查询进行编码。这对我的实际使用来说很好,因为我主要需要重复静态调用并且只改变地理位置,这似乎是一种不好的做法,我正在尝试找出一种更通用的方法。

另一个旁注:我从 Drakma 切换到 Dex,因为我无法让 Drakma 处理纯字符串——它总是对我传递的内容进行编码,我似乎无法关闭它。

4

0 回答 0