Кодировка URI в C++ REST SDK ("Касабланка")
Я использую http-приемник C++ REST SDK 2.8 и заметил следующее. Если я отправлю следующий URL для этого слушателя:
http://my_server/my%2fpath?key=xxx%26yyy%3Dzzz
и я делаю:
auto uri = request.relative_uri();
auto v_path_components = web::uri::split_path(web::uri::decode(uri.path()));
auto m_query_components = web::uri::split_query(web::uri::decode(uri.query()));
затем я обнаружил, что v_path_components содержит 2 элемента ["my", "path"], а m_query_components содержит 2 пары [("key","xxx"), ("yyy","zzz")].
Я хочу и ожидал, что v_path_components будет содержать 1 элемент ["my/path"], а m_query_components будет содержать 1 пару [("key","xxx&yyy=zzz")].
Для того чтобы последний достиг, относительный_ури не должен декодировать / кодировать URI, так как это теряет информацию. Кроме того, web:: uri:: decode () должна выполняться для результатов разделения, а не до разделения. Но поскольку сам REST SDK, а также многие сэмплы, поставляемые с ним, используют это вышеописанным способом, это заставляет меня поверить, что я могу ошибаться.
Может ли кто-нибудь подтвердить мои выводы или объяснить, почему я не на том пути?
1 ответ
Ваши выводы имеют смысл.
Поскольку вы сначала декодируете, то закодированный амперсанд (%3D) становится разделителем пары ключ / значение. То же самое для компонентов пути. Косая черта (%2f) становится разделителем пути и анализируется как таковой.