哪些库/调用可用于处理包含分号的查询字符串与parse_qs不同?
>>> urlparse.parse_qs("tagged=python;ruby")
>>> {'tagged': ['python']}
我正在使用StackExchange API来搜索已标记的问题。
Search的布局是这样的,标签用分号分隔:
/2.1/search?order=desc&sort=activity&tagged=python;ruby&site=stackoverflow
与API交互就好了。当我想测试调用时,尤其是在使用httpretty来模拟HTTP时,会出现问题。
在幕后,httpretty
正在使用python标准库中的urlparse.parse_qs
来解析查询字符串。
>>> urlparse.parse_qs("tagged=python;ruby")
{'tagged': ['python']}
显然这不太好用。这是一个小例子,这是一个httpretty的片段(在测试环境之外)。
import requests
import httpretty
httpretty.enable()
httpretty.register_uri(httpretty.GET, "https://api.stackexchange.com/2.1/search", body='{"items":[]}')
resp = requests.get("https://api.stackexchange.com/2.1/search", params={"tagged":"python;ruby"})
httpretty_request = httpretty.last_request()
print(httpretty_request.querystring)
httpretty.disable()
httpretty.reset()
我想使用httpretty中的机制,但需要parse_qs
的解决方法。我现在可以修补httpretty,但是很想看看还能做些什么。
答案 0 :(得分:1)
为了解决这个问题,我暂时修补httpretty.core.unquote_utf8
(技术上httpretty.compat.unquote_utf8
)。
#
# To get around how parse_qs works (urlparse, under the hood of
# httpretty), we'll leave the semi colon quoted.
#
# See https://github.com/gabrielfalcao/HTTPretty/issues/134
orig_unquote = httpretty.core.unquote_utf8
httpretty.core.unquote_utf8 = (lambda x: x)
# It should handle tags as a list
httpretty.register_uri(httpretty.GET,
"https://api.stackexchange.com/2.1/search",
body=param_check_callback({'tagged': 'python;dog'}))
search_questions(since=since, tags=["python", "dog"], site="pets")
...
# Back to normal for the rest
httpretty.core.unquote_utf8 = orig_unquote
# Test the test by making sure this is back to normal
assert httpretty.core.unquote_utf8("%3B") == ";"
这假设你不需要任何其他的东西。另一种选择是在分号达到parse_qs
之前只留下百分号编码。