Delimitador para usar dentro de un valor de cadena de consulta
-
22-07-2019 - |
Pregunta
Necesito aceptar una lista de nombres de archivo en una cadena de consulta. es decir:
http://someSite/someApp/myUtil.ashx?files=file1.txt|file2.bmp|file3.doc
¿Tiene alguna recomendación sobre qué delimitador usar?
Solución
Si son nombres de archivo, una buena opción sería un personaje que no está permitido en los nombres de archivo. Las sugerencias hasta ahora incluyen , | & amp;
que generalmente están permitidos en los nombres de archivo y, por lo tanto, pueden generar ambigüedades. /
por otro lado generalmente no está permitido, ni siquiera en Windows. Está permitido en los URI y no tiene un significado especial en las cadenas de consulta.
Ejemplo:
http: //someSite/someApp/myUtil.ashx? files = file1.txt | file2.bmp | file3.doc
es incorrecto porque puede referirse al archivo válido file1. txt | file2.bmp
.
http: //someSite/someApp/myUtil.ashx? files = file1.txt / file2.bmp / ??file3.doc
se refiere inequívocamente a 3 archivos.
Otros consejos
Tener parámetros de consulta varias veces es legal, y la única forma de garantizar que no haya problemas de análisis en todos los casos:
http://someSite/someApp/myUtil.ashx?file=file1.txt&file=file2.bmp&file=file3.doc
El punto y coma ;
debe estar codificado en URI si forma parte de un nombre de archivo (convertido a % 3B
), pero no si está separando parámetros de consulta, que es su uso reservado.
Consulte la sección 2.2 de este rfc :
2.2. Caracteres reservados
Los URI incluyen componentes y subcomponentes que están delimitados por caracteres en el " reservado " conjunto. Estos personajes se llaman " reservado " porque pueden (o no) definirse como delimitadores por la sintaxis genérica, por cada sintaxis específica del esquema, o por la sintaxis específica de implementación del algoritmo de desreferenciación de un URI. Si los datos de un componente URI entraran en conflicto con un reservado propósito del personaje como delimitador, entonces los datos en conflicto deben ser codificado por ciento antes de que se forme el URI.
reserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@" sub-delims = "!" / "<*>quot; / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
Recomendaría que cada archivo tenga su propio parámetro de consulta, es decir,
myUtil.ashx?file1=file1.txt&file2=file2.bmp&file3=file3.doc
De esta forma, puede usar el análisis y el bucle de consulta estándar
¿Necesita enumerar los nombres de los archivos como una cadena? La mayoría de los idiomas aceptan matrices en la cadena de consulta para que pueda escribirlo como
http://someSite/someApp/myUtil.ashx?files[]=file1.txt&files[]=file2.bmp&files[]=file3.doc
Si no lo hace, o no puede usarlo por alguna otra razón, debe apegarse a un delimitador que no esté permitido o sea inusual en un nombre de archivo. Pipe (|) es bueno, de lo contrario, podría codificar un carácter invisible ya que son bastante fáciles de usar en la codificación, pero más difíciles de incluir en un nombre de archivo.
Normalmente uso matrices cuando es posible y canalizo de otra manera.
Siempre he usado tubos dobles " || " ;. No tengo ninguna buena evidencia para respaldar por qué esta es una buena opción aparte de los 10 años de programación web y nunca ha sido un problema.
Este es un problema común. Cómo lo manejé fue: creé un método que aceptaba una lista de cadenas, luego encontré un carácter que no estaba en ninguna de las cadenas. (Hice esto mediante una simple concatenación de las cadenas, luego probando varios caracteres.) Una vez que se encontró un carácter, concatenaba todas las cadenas juntas pero también anteponía la cadena con el carácter de separación. Entonces, en la pregunta dada, un ejemplo sería: http: //someSite/someApp/myUtil.ashx? files = | file1.txt | file2.bmp | file3.doc y otro wud será: http: //someSite/someApp/myUtil.ashx? files =, file1.txt, file2.bmp, file3.doc Pero como realmente uso un método que garantiza que mi carácter separador no está en el resto de las cadenas, es seguro. Fue un poco difícil de crear la primera vez, pero lo he usado MUCHAS veces en varias aplicaciones.
Creo que consideraría usar comas o punto y coma.
Me basaría en la respuesta de MSalters diciendo que, para generalizar, el mejor delimitador es uno que no es válido para los elementos de la lista. Por ejemplo, si su lista son precios, una coma es un delimitador incorrecto porque puede confundirse con los valores. Por esa razón, como la mayoría de estas respuestas sugieren, creo que un buen delimitador de propósito general es probablemente '' | '' ya que rara vez es un valor válido. " / " tal vez no sea el mejor delimitador en general, ya que a veces es válido para rutas.