Domanda

Devo accettare un elenco di nomi di file in una stringa di query. cioè:

http://someSite/someApp/myUtil.ashx?files=file1.txt|file2.bmp|file3.doc

Hai qualche consiglio su quale delimitatore utilizzare?

È stato utile?

Soluzione

Se sono nomi di file, una buona scelta sarebbe un personaggio che non è consentito nei nomi di file. I suggerimenti finora inclusi , | & amp; che sono generalmente consentiti nei nomi di file e quindi potrebbero portare ad ambiguità. / d'altra parte non è generalmente consentito, nemmeno su Windows. È consentito negli URI e non ha alcun significato speciale nelle stringhe di query.

Esempio:

http: //someSite/someApp/myUtil.ashx? files = file1.txt | file2.bmp | file3.doc è errato perché può fare riferimento al file file1 valido. txt |. file2.bmp

http: //someSite/someApp/myUtil.ashx? files = file1.txt / file2.bmp / ??file3.doc si riferisce inequivocabilmente a 3 file.

Altri suggerimenti

Avere parametri di query più volte è legale e l'unico modo per garantire in nessun caso problemi di analisi:

http://someSite/someApp/myUtil.ashx?file=file1.txt&file=file2.bmp&file=file3.doc

Il punto e virgola ; deve essere codificato URI se parte di un nome file (trasformato in % 3B ), ma non se sta separando i parametri della query che è il suo uso riservato.

Vedi la sezione 2.2 di questa rfc :

  

2.2. Personaggi riservati

     

Gli URI includono componenti e sottocomponenti delimitati da      caratteri in " riservato " impostato. Questi personaggi sono chiamati      & Quot; riservato " perché possono (o non possono) essere definiti come delimitatori da      la sintassi generica, in base a ciascuna sintassi specifica dello schema o tramite      sintassi specifica dell'implementazione dell'algoritmo di dereferenziazione di un URI.      Se i dati per un componente URI sarebbero in conflitto con un riservato      lo scopo del personaggio come delimitatore, quindi i dati in conflitto devono essere      codificato in percentuale prima della formazione dell'URI.

 reserved    = gen-delims / sub-delims

 gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"

 sub-delims  = "!" / "<*>quot; / "&" / "'" / "(" / ")"
             / "*" / "+" / "," / ";" / "="

Vorrei raccomandare di rendere ogni file il proprio parametro di query, ovvero

myUtil.ashx?file1=file1.txt&file2=file2.bmp&file3=file3.doc

In questo modo puoi semplicemente utilizzare l'analisi e il ciclo delle query standard

Devi elencare i nomi dei file come stringa? La maggior parte delle lingue accetta le matrici nella stringa di query in modo da poterle scrivere come

http://someSite/someApp/myUtil.ashx?files[]=file1.txt&files[]=file2.bmp&files[]=file3.doc

In caso contrario, o non è possibile utilizzarlo per qualche altro motivo, è necessario attenersi a un delimitatore non consentito o insolito in un nome file. Pipe (|) è buono, altrimenti potresti urlencode un carattere invisibile poiché sono abbastanza facili da usare nella codifica, ma più difficile da includere in un nome file.

Di solito uso array quando possibile e pipe altrimenti.

Ho sempre usato tubi doppi " || " ;. Non ho alcuna buona prova a sostegno del perché questa sia una buona scelta oltre a 10 anni di programmazione Web e non è mai stato un problema.

Questo è un problema comune. Come l'ho gestito è stato: ho creato un metodo che ha accettato un elenco di stringhe, quindi ho trovato un carattere che non era in nessuna delle stringhe. (L'ho fatto con una semplice concatenazione delle stringhe, quindi testando vari personaggi.) Una volta trovato un carattere, ha concatenato tutte le stringhe insieme ma ha anche anteposto la stringa con il carattere di separazione. Quindi nella domanda data, un esempio dovrebbe essere: http: //someSite/someApp/myUtil.ashx? file = | file1.txt | file2.bmp | file3.doc e un altro sarebbe: http: //someSite/someApp/myUtil.ashx? file =, file1.txt, file2.bmp, file3.doc Ma dal momento che uso effettivamente un metodo che garantisce che il mio carattere di separazione non si trova nel resto delle stringhe, è sicuro. È stato un po 'di lavoro per creare la prima volta, ma l'ho usato MOLTE volte in varie applicazioni.

Penso che prenderei in considerazione l'uso di virgole o punti e virgola.

Vorrei basarmi sulla risposta di MSalter dicendo, per generalizzare, il delimitatore migliore è uno che non è valido per gli elementi nell'elenco. Ad esempio, se l'elenco è costituito da prezzi, una virgola è un delimitatore errato poiché può essere confusa con i valori. Per questo motivo, come suggeriscono la maggior parte di queste risposte, penso che un buon delimitatore per scopi generici sia probabilmente "quot | |"; poiché raramente è un valore valido. & Quot; / " non è forse il miglior delimitatore in generale in quanto è valido per i percorsi a volte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top