2013-04-05 4 views
5

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:

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

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.

+0

+1. Poczekaj tylko, aż będziesz potrzebował kodować ukośniki ... Sysmem.Uri "pomocniczo" unescapes je wszystkie bez pytania o bezpieczeństwo "funkcji". – Cameron

+1

W twoim przykładzie nie ma łańcucha zapytania ... Nie jestem pewien, czy czegoś brakuje ... –

+0

@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

Odpowiedz

1

This wątek ma podobne pytanie \ rozwiązanie.

Jak wspomniano w odpowiedzi z powyższego linku, uniknęłabym znaków zakodowanych w adresach URL w URI i zamiast tego wstawiłam je w części z zapytaniem.

+0

Wykonuję ruch, aby uniknąć znaków zakodowanych na adresie URL w ścieżce i zamiast tego wstawić je w zapytaniu. –

+0

@TymothyShields Zgadzam się ... chociaż perspektywa jest 20/20. Interfejs API został już opublikowany i upubliczniony, a wyszukiwane hasło zawierające ampersand było przypadkiem narożnym, który pojawił się dopiero po przetestowaniu i wydaniu kontroli jakości. – mdisibio

Powiązane problemy