Délimiteur à utiliser dans une requête de la chaîne de valeur
J'ai besoin d'accepter une liste de noms de fichier dans une chaîne de requête. c'est à dire:
http://someSite/someApp/myUtil.ashx?files=file1.txt|file2.bmp|file3.doc
Avez-vous des recommandations sur ce délimiteur à utiliser?
Vous devez vous connecter pour publier un commentaire.
Si ils sont des noms de fichiers, un bon choix serait un personnage qui est pas autorisé dans les noms de fichiers. Suggestions jusqu'à présent inclus
, | &
qui sont généralement autorisés dans les noms de fichiers et par conséquent, peut conduire à des ambiguïtés./
sur l'autre main est généralement pas admis, pas même sur Windows. Il est autorisé dans les Uri, et il n'a pas de signification particulière dans les chaînes de requête.Exemple:
http://someSite/someApp/myUtil.ashx?files=file1.txt|file2.bmp|file3.doc
est mauvais, car il peut se référer à la validité de fichierfile1.txt|file2.bmp
.http://someSite/someApp/myUtil.ashx?files=file1.txt/file2.bmp/file3.doc
sans ambiguïté se rapporte à 3 fichiers.|
est un mauvais choix en ce qui concerne les noms de fichiers. Il peut aussi être un mauvais choix dans les URL, je ne suis même pas faire une réclamation à ce sujet. Alors, comment est-ce que ma réponse incorrecte?Avoir des paramètres de requête plusieurs fois est légal, et la seule façon de garantir l'absence d'analyse des problèmes dans tous les cas:
Le point-virgule
;
doit être URI codé si une partie d'un nom de fichier (tourné à%3B
), pourtant pas si c'est de séparer les paramètres de la requête, qui est sa réservée.Voir la section 2.2 de cette rfc:
Je recommanderais faire de chaque fichier son propre paramètre de requête, c'est à dire
De cette façon, vous pouvez simplement utiliser de requête standard d'analyse et de boucle
Avez-vous besoin de la liste des noms de fichiers comme une chaîne de caractères?
La plupart des langues accepte les tableaux dans la chaîne de requête de sorte que vous pouvez l'écrire comme
Si ce n'est pas, ou vous ne pouvez pas l'utiliser pour une autre raison, vous devez vous en tenir à un délimiteur qui n'est pas autorisé ou inhabituelles dans un nom de fichier. Pipe (|) est un bon un, sinon vous risquez de urlencode un personnage invisible car ils sont très faciles à utiliser pour le codage, mais plus difficile à inclure dans un nom de fichier.
J'ai l'habitude d'utiliser des ensembles lorsque cela est possible et le tuyau autrement.
J'ai toujours utilisé des doubles pipes "||". Je n'ai pas de preuves suffisantes pour sauvegarder pourquoi est-ce un bon choix autres que les 10 ans de la programmation web et il n'a jamais été un problème.
C'est un problème commun. Comment j'ai géré ça a été: j'ai créé une méthode qui a accepté une liste de chaînes de caractères, puis a trouvé un personnage qui n'était pas dans les cordes. (Je l'ai fait par une simple concaténation de chaînes de caractères, puis les essais pour les différents personnages.) Une fois qu'un personnage a été trouvé, concaténés toutes les chaînes, mais aussi précédées de la chaîne avec le caractère de séparation. Ainsi, dans la question, un exemple duh être:
http://someSite/someApp/myUtil.ashx?files=/file1.txt/file2.bmp/file3.doc
et un autre duh être:
http://someSite/someApp/myUtil.ashx?files=,file1.txt,fichier2.bmp,file3.doc
Mais depuis que j'ai fait d'utiliser une méthode qui garantit mon caractère de séparation n'est pas dans le reste des cordes, c'est sûr. C'était un peu de travail pour créer la première fois, mais je l'ai utilisé à de NOMBREUSES reprises dans diverses applications.
Je pense que je voudrais envisager d'utiliser des virgules ou des points-virgules.
Je voudrais construire sur MSalters répondre en disant, pour généraliser, le meilleur séparateur est celui qui est invalide pour les éléments de la liste. Par exemple, si votre liste est des prix, une virgule est une mauvaise délimiteur, car il peut être confondu avec les valeurs. Pour cette raison, car la plupart de ces réponses suggèrent, je pense que d'un but d'intérêt général en france est probablement "|" comme il est rarement une valeur valide. "/" est peut-être pas le meilleur séparateur de façon générale, car elle est valable pour les chemins parfois.