2013-04-05 6 views
5

utilizzando le librerie System.ServiceModel per il routing, Ho un servizio REST con un semplice modello che assomigliaE 'possibile avere un parametro url REST con una e commerciale?

"{} searchTerm? Optare = {} someSearchOpt

Quindi la chiamata apparirebbe come:

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

per cercare fo r la frase "spedizioni fluviali" senza opzioni.

Questo semplicemente accetta una frase di ricerca e restituisce risultati. Funziona bene. Tuttavia, se la ricerca di una frase che contiene quel carattere, come ad esempio "Lewis & Clark", ho provato l'ovvio di URL che codifica per il commerciale

Lewis% 26Clark

ma anche così la richiesta non è mai nemmeno instradato, ma il server restituisce immediatamente 400 Bad Request. È chiaro che viene interpretato come un delimitatore di stringhe di query e rende invalida la richiesta poiché questo particolare modello si aspetta un parametro url e non ha il precedere "?" delimitatore.

Poiché queste frasi di ricerca possono avere altri caratteri limitati, sono previsti dall'URL codificato dal client e quando vengono instradati correttamente, l'API REST chiama HttpUtility.UrlDecode sul parametro. Quindi la mia domanda è davvero se ci sia qualche tecnica per ottenere una e commerciale di e codifica url correttamente indirizzata come parametro di rest url e non interpretata e rifiutata preventivamente come un delimitatore di stringhe di query?

Aggiornamento: per la cronologia, se il termine di ricerca era previsto come parametro stringa di query (non un parametro url), l'invio di Lewis% 26Clark funziona correttamente. Per esempio

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

Quindi, per chiarire, io sto cercando di ottenere lo stesso risultato quando si utilizza un parametro URL in un modello REST.

+0

+1. Attendi fino a quando non avrai bisogno di codificare le barre ... Sysmem.Uri "disponibile" li disimpegna tutti senza essere chiesto come "funzionalità" di sicurezza. – Cameron

+1

Non è presente alcuna stringa di query nel campione ... Non sono sicuro se mi manca qualcosa ... –

+0

@alexei ... esattamente il punto ... è un api REST, e quindi il termine di ricerca è un parametro url , non un parametro stringa di query ... un esempio più comune è 'http: // myhost.contoso.com/restapi/customer/3' dove" 3 "è un parametro url. Nel mio esempio, il parametro di stringa di query "opt" è facoltativo e può essere escluso. – mdisibio

risposta

1

This thread ha una domanda simile \ soluzione.

Come accennato nella risposta dal collegamento precedente, eviterei url codificare i caratteri nell'URI e invece inserirli nella parte della stringa di query.

+0

In secondo luogo il movimento per evitare i caratteri con codifica url nel percorso e invece li inserisco nella query. –

+0

@TimothyShield Sono d'accordo ... anche se il senno di poi è 20/20. L'API era già stata pubblicata e resa pubblica, e il termine di ricerca contenente la e commerciale era un caso isolato uscito solo dopo il test e il rilascio del QA. – mdisibio

Problemi correlati