Мне нужно принять список имен файлов в строке запроса. т.е.:
http://someSite/someApp/myUtil.ashx?files=file1.txt|file2.bmp|file3.doc
Есть ли у вас какие-либо рекомендации по использованию разделителя?
Мне нужно принять список имен файлов в строке запроса. т.е.:
http://someSite/someApp/myUtil.ashx?files=file1.txt|file2.bmp|file3.doc
Есть ли у вас какие-либо рекомендации по использованию разделителя?
Если они являются именами файлов, хорошим выбором будет символ, который запрещен именами файлов. Предложения до сих пор включали , | &
, которые обычно разрешены в именах файлов и, следовательно, могут приводить к двусмысленности. /
, с другой стороны, обычно не разрешается, даже в 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 файла.
Наличие параметров запроса несколько раз является допустимым, и единственный способ гарантировать отсутствие проблем с синтаксическим анализом во всех случаях:
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 = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
Я бы рекомендовал сделать для каждого файла свой собственный параметр запроса, т.е.
myUtil.ashx?file1=file1.txt&file2=file2.bmp&file3=file3.doc
Таким образом, вы можете просто использовать стандартный синтаксический анализ запросов и цикл
Вам нужно указать имена файлов в виде строки? Большинство языков принимают массивы в querystring, поэтому вы можете написать это как
http://someSite/someApp/myUtil.ashx?files[]=file1.txt&files[]=file2.bmp&files[]=file3.doc
Если это не так, или вы не можете использовать по какой-либо другой причине, вы должны придерживаться разделителя, который либо не разрешен, либо необычен в имени файла. Pipe (|) является хорошим, иначе вы могли бы urlencode невидимый персонаж, так как они довольно просты в использовании в кодировании, но сложнее фактически включать в имя файла.
Я обычно использую массивы, когда это возможно, и труба в противном случае.
Я всегда использовал двойные трубы "||". У меня нет никаких хороших доказательств того, почему это хороший выбор, кроме 10 лет веб-программирования, и это никогда не было проблемой.
Это одна общая проблема. Как я справился с этим: я создал метод, который принял список строк, а затем нашел символ, который не был ни в одной из строк. (Я сделал это путем простой конкатенации строк, а затем для тестирования различных символов.) Как только символ был найден, объединил все строки вместе, но также добавил строку с символом разделения. Таким образом, в данном вопросе одним из примеров является: http://someSite/someApp/myUtil.ashx?files=|file1.txt|file2.bmp|file3.doc и еще один wud be: http://someSite/someApp/myUtil.ashx?files=,file1.txt,file2.bmp,file3.doc Но так как я фактически использую метод, который гарантирует, что мой разделительный символ не находится в остальных строках, он безопасен. Это была небольшая работа, чтобы создать первый раз, но я использовал его много раз в различных приложениях.
Я думаю, что я хотел бы использовать запятые или точки с запятой.
Я бы основывался на ответе MSalters, говоря, что для обобщения лучший разделитель является недопустимым для элементов в списке. Например, если в вашем списке указаны цены, запятая является плохим разделителем, потому что ее можно путать со значениями. По этой причине, как и большинство этих ответов, я думаю, что хороший разделитель общего назначения, вероятно, "|" поскольку это редко действительное значение. "/", возможно, не самый лучший разделитель, поскольку он действителен для путей иногда.