/content/v1/clients/clientname/function?id=functionnamec&subfunction?id=subfunctionaname
Разбор URI определяется RFC 3986 . В частности, U+003F QUESTION MARK
является зарезервированным символом, первый экземпляр которого служит разделителем между относительной частью и запросом.
То есть разрывы в вашем примере будут восприниматься как
path: /content/v1/clients/clientname/function
query: id=functionnamec&subfunction?id=subfunctionaname
И если бы мы проанализировали запрос, как если бы это было значение application/x-www-form-urlencoded
....
>>> import urllib.parse
>>> urllib.parse.parse_qs("id=functionnamec&subfunction?id=subfunctionaname")
{'id': ['functionnamec'], 'subfunction?id': ['subfunctionaname']}
Мы видим, что второй знак вопроса становится частью имени параметра.
Короче говоря, это совершенно правильный URI, но вряд ли он даст результаты, на которые вы надеетесь.
/content/v1/clients/clientname/function/subfunction?id=functionnamec&id=subfunctionaname
Это может быть полезно, но есть вероятность путаницы с параметрами запроса идентификатора дубликата
>>> urllib.parse.parse_qs("id=functionnamec&id=subfunctionaname")
{'id': ['functionnamec', 'subfunctionaname']}
/content/v1/clients/clientname/function/subfunction?function.id=functionnamec&subfunction.id=subfunctionaname
>>> urllib.parse.parse_qs("function.id=functionnamec&subfunction.id=subfunctionaname")
{'function.id': ['functionnamec'], 'subfunction.id': ['subfunctionaname']}
Это может быть проще.
Я думаю, что было бы обычным извлекать данные из запроса и вместо этого помещать их в путь
/content/v1/clients/clientname/function/functionname/subfunction/subfunctionaname
А затем извлеките параметры пути, которые вам нужны.