我在 API 端点上遇到问题,如果发送的数据库查询包含特殊字符,如“ä”,MongoDB 找不到任何数据。
@router.get("")
def get_something_data(name: Optional[str] = None):
query = {}
if name:
query.update({"Name": re.compile(name, re.IGNORECASE)})
db = pymongo.MongoClient("localhost:whatever")
database = db[os.environ["DB_SOMETHING"]]
collection = database[os.environ["COLL_SOMETHING"]]
return collection.find(query))
如果我打印查询参数,它看起来很好。经过几个小时的调试,我发现如果我强制为查询设置一个值(而不是使用请求中的参数),它就可以正常工作。像这样:
@router.get("")
def get_something_data(name: Optional[str] = None):
query = {}
if name:
query.update({"Name": re.compile("Fixed search value with ä", re.IGNORECASE)})
db = pymongo.MongoClient("localhost:whatever")
database = db[os.environ["DB_SOMETHING"]]
collection = database[os.environ["COLL_SOMETHING"]]
return collection.find(query))
我怀疑这是一个编码问题,但我还没有找到解决这个问题的方法,所以我来这里寻求帮助。这确实是一个奇怪的问题,我还没有看到其他人有这个问题。
编辑:不确定这在这种情况下是否有帮助,但是
?search=ä
的请求参数被转换为 ?search=%C3%83%C2%A4
。至少根据我的理解,一个字符应该根据编码转换为一个或两个%xx
字符,所以可能会发生一些奇怪的事情?即便如此,打印请求参数仍会按原样打印ä
。