2013-04-05 1 views
5

Использование библиотеки system.serviceModel для маршрутизации, у меня есть службы REST с помощью простого шаблона, который выглядит какВозможно ли иметь параметр REST url с амперсандом?

«{SEARCHTERM}? Выбрать = {} someSearchOpt

Поэтому вызов будет выглядеть как:

http://myhost.contoso.com/searchapi/river%20expeditions

искать Ф.О. r фраза «речные экспедиции» без вариантов.

Это просто принимает поисковую фразу и возвращает результаты. Он работает отлично. Однако, если поиск по фразе, которая содержит буквальный амперсанд, например, как «Льюис & Кларк», я попытался очевидный ВГД, кодирующего амперсанд

Льюис% 26Clark

но даже запрос никогда не маршрутизируется, но сервер немедленно возвращает 400 Bad Request. Понятно, что он интерпретируется как разделитель строки запроса и делает запрос недействительным, поскольку этот конкретный шаблон ожидает параметра url и не имеет предшествующего '?' разделитель.

Поскольку эти поисковые фразы могут иметь другие ограниченные символы, ожидается, что они будут закодированы клиентом, а при их успешной маршрутизации REST api вызывает HttpUtility.UrlDecode в параметре. Итак, мой вопрос в том, действительно ли есть какой-то метод получения URL-адреса, кодированного url, правильно маршрутизируемого как параметр url для отдыха, а не интерпретируемый и не интерпретируемый как разделитель строки запроса?

Обновление: для записи, если поисковый запрос ожидался как параметр строки запроса (не параметр url), отправка Lewis% 26Clark работает нормально. Например

http://myhost.contoso.com/searchapi?searchTerm=lewis%26clark

Так уточнить, я ищу, чтобы получить тот же результат при использовании параметра URL-адреса в шаблоне REST.

+0

+1. Подождите, пока вам не понадобится кодировать косые черты ... Sysmem.Uri «полезно» отменяет их все, не задаваясь в качестве функции безопасности. – Cameron

+1

В вашем примере нет строки запроса ... Не уверен, что я что-то пропустил ... –

+0

@alexei ... точно точка ... это REST api, поэтому термин поиска является параметром url , а не параметр строки запроса ... более распространенным примером является «http: // myhost.contoso.com/restapi/customer/3», где «3» является параметром url. В моем примере параметр запроса «opt» необязателен и может быть опущен. – mdisibio

ответ

1

This нить имеет аналогичный вопрос \ решение.

Как упоминалось в ответе из приведенной выше ссылки, я бы избегал кодирования символов url в uri и вместо этого помещал их в часть строки запроса.

+0

Я второй, чтобы избежать кодирования символов в пути и вместо этого придерживаться их в запросе. –

+0

@TimothyShields Я согласен ... хотя задним числом 20/20. API уже был опубликован и обнародован, а поисковый запрос, основанный на амперсанде, был угловым, который вышел только после тестирования и выпуска QA. – mdisibio

Смежные вопросы