Разделитель для использования внутри значения строки запроса - PullRequest
21 голосов
/ 13 марта 2009

Мне нужно принять список имен файлов в строке запроса. то есть:

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

Есть ли у вас какие-либо рекомендации относительно того, какой разделитель использовать?

Ответы [ 8 ]

21 голосов
/ 09 января 2013

Наличие параметров запроса несколько раз является законным, и единственный способ гарантировать отсутствие проблем с синтаксическим анализом во всех случаях:

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

Точка с запятой ; должна быть закодирована URI, если часть имени файла (обращена к %3B), но не в том случае, если она разделяет параметры запроса, что является его зарезервированным использованием.

См. Раздел 2.2 из данного rfc :

2,2. Зарезервированные персонажи

URI включают компоненты и подкомпоненты, которые разделены символы в «зарезервированном» наборе. Эти персонажи называются «зарезервированы», потому что они могут (или не могут) быть определены как разделители общий синтаксис, для каждого специфичного для схемы синтаксиса или специфичный для реализации синтаксис алгоритма разыменования URI. Если данные для компонента URI будут конфликтовать с зарезервированным цель персонажа как разделитель, то конфликтующие данные должны быть кодируется в процентах до формирования URI.

 reserved    = gen-delims / sub-delims

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

 sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
             / "*" / "+" / "," / ";" / "="
14 голосов
/ 13 марта 2009

Если это имена файлов, хорошим выбором будет символ, который запрещен в именах файлов. До сих пор предложения включали , | &, которые обычно допускаются в именах файлов и, следовательно, могут привести к неоднозначности / с другой стороны, как правило, не допускается, даже в Windows. Это разрешено в URI и не имеет специального значения в строках запроса.

Пример:

http://someSite/someApp/myUtil.ashx?files=file1.txt|file2.bmp|file3.doc плохо, так как может ссылаться на действительный файл file1.txt|file2.bmp.

http://someSite/someApp/myUtil.ashx?files=file1.txt/file2.bmp/file3.doc однозначно ссылается на 3 файла.

7 голосов
/ 13 марта 2009

Я бы порекомендовал сделать каждый файл своим параметром запроса, т.е.

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

Таким образом, вы можете просто использовать стандартный синтаксический анализ запроса и цикл

6 голосов
/ 13 марта 2009

Вам нужно перечислить имена файлов в виде строки? Большинство языков принимает массивы в строке запроса, так что вы можете написать это как

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

Если это не так или вы не можете использовать его по какой-либо другой причине, вам следует придерживаться разделителя, который либо не разрешен, либо необычен в имени файла. Трубка (|) - хороший вариант, в противном случае вы можете urlencode невидимого символа, поскольку его довольно легко использовать при кодировании, но на самом деле его сложнее включить в имя файла.

Я обычно использую массивы, когда это возможно, и трубу иначе.

5 голосов
/ 13 марта 2009

Я всегда использовал двойные трубы "||". У меня нет убедительных доказательств того, почему это хороший выбор, кроме 10-летнего веб-программирования, и это никогда не было проблемой.

1 голос
/ 25 января 2016

Это одна распространенная проблема. Как я справился с этим: я создал метод, который принял список строк, а затем нашел символ, которого не было ни в одной из строк. (Я сделал это простой конкатенацией строк, затем проверил на наличие различных символов.) После того, как символ был найден, конкатенировали все строки вместе, но также добавили в строку символ разделения. Таким образом, в данном вопросе один пример будет: http://someSite/someApp/myUtil.ashx?files=|file1.txt|file2.bmp|file3.doc и другой будет: http://someSite/someApp/myUtil.ashx?files=,file1.txt,file2.bmp,file3.doc Но поскольку я на самом деле использую метод, который гарантирует, что мой символ-разделитель отсутствует в остальных строках, он безопасен. Создание было первым делом, но я много раз использовал его в различных приложениях.

0 голосов
/ 21 декабря 2012

Я бы основывался на ответе MSalters, говоря, что, в общем, лучшим разделителем является тот, который недопустим для элементов в списке. Например, если в списке указаны цены, запятая является плохим разделителем, поскольку ее можно спутать со значениями. По этой причине, как показывает большинство этих ответов, я думаю, что хорошим разделителем общего назначения, вероятно, является "|" как это редко допустимое значение. "/", возможно, вообще не лучший разделитель, так как иногда он допустим для путей.

0 голосов
/ 13 марта 2009

Я думаю, я бы хотел использовать запятые или точки с запятой.

...