2016-04-01 2 views
2

Я использую http-прослушиватель C++ REST SDK 2.8 и заметил следующее. Если я отправить следующий URL для этого приемника:URI-кодировка в C++ REST SDK («Casablanca»)

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 элемента [ "мой", "путь"], и m_query_components содержит 2 пары [(«ключ», «xxx»), («yyy», «zzz»)].

То, что я хочу, и ожидал бы это v_path_components содержит 1 элемент [ "мой/путь"], и m_query_components содержит 1 пар [("ключ", "ххх & его = ZZZ")] ,

Для достижения последнего relative_uri не должен декодировать/кодировать uri, поскольку это теряет информацию. Кроме того, web :: uri :: decode() должен выполняться по результатам разделения, а не перед расщеплением. Но, поскольку сам REST SDK, а также множество образцов, поставляемых вместе с ним, используют это выше, это заставляет меня думать, что я могу ошибаться.

Может ли кто-нибудь подтвердить мои выводы или объяснить, почему я нахожусь на неправильном пути?

ответ

0

Ваши выводы имеют смысл.

Поскольку вы сначала декодируете, то кодированный амперсанд (% 3D) становится разделителем пары ключ/значение. То же самое для компонентов пути. Слэш (% 2f) становится разделителем путей и анализируется как таковой.