Korzystanie z bibliotek System.ServiceModel dla routingu, Mam usługi REST za pomocą prostego szablonu, który wygląda jakCzy jest możliwe ustawienie parametru URL REST za pomocą znaku ampersand?
„{SEARCHTERM}? Opt = {someSearchOpt}
Tak będzie wyglądać rozmowa jak:
szukać fo r fraza "wyprawy rzeczne" bez opcji.
Po prostu akceptuje wyszukiwaną frazę i zwraca wyniki. Działa dobrze. Jednakże, jeśli poszukiwania frazy, która zawiera dosłowne ampersanda, takich jak „Lewisa & Clark”, próbowałem oczywiste URL kodującego ampersanda
Lewis% 26Clark
ale mimo to wniosek nigdy nie jest nawet routowany, ale serwer natychmiast zwraca 400 nieprawidłowych żądań. Oczywiste jest, że jest on interpretowany jako ogranicznik łańcucha zapytania i powoduje, że żądanie jest nieważne, ponieważ ten konkretny szablon oczekuje parametru adresu URL i nie ma poprzedzającego "?". ogranicznik.
Ponieważ te wyszukiwane słowa mogą mieć inne zastrzeżone znaki, są one wymagane przez adres URL zakodowany przez klienta, a po pomyślnym przekierowaniu aplet REST wywołuje parametr HttpUtility.UrlDecode. Tak więc moje pytanie brzmi, czy jest jakaś technika uzyskiwania kodowanego adresu URL i poprawnie przekierowywana jako parametr URL-a odpoczynku, a nie z wyprzedzeniem interpretowana i odrzucana jako ogranicznik łańcucha zapytania?
Aktualizacja: Dla rekordu, jeśli wyszukiwane hasło było oczekiwane jako parametr ciągu zapytania (a nie parametr url), wysyłanie Lewis% 26Clark działa poprawnie. Na przykład
http://myhost.contoso.com/searchapi?searchTerm=lewis%26clark
więc wyjaśnienie, szukam, aby uzyskać ten sam efekt przy użyciu parametru url w szablonie REST.
+1. Poczekaj tylko, aż będziesz potrzebował kodować ukośniki ... Sysmem.Uri "pomocniczo" unescapes je wszystkie bez pytania o bezpieczeństwo "funkcji". – Cameron
W twoim przykładzie nie ma łańcucha zapytania ... Nie jestem pewien, czy czegoś brakuje ... –
@alexei ... dokładnie ten punkt ... to jest API usługi REST, dlatego wyszukiwany termin to parametr adresu URL , a nie parametr ciągu zapytania ... częstszym przykładem jest 'http: // myhost.contoso.com/restapi/customer/3' gdzie" 3 "jest parametrem adresu URL. W moim przykładzie parametr ciąg zapytania "opt" jest opcjonalny i można go pominąć. – mdisibio