Подтвердить что ты не робот

Разделитель для использования в пределах значения строки запроса

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

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

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

4b9b3361

Ответ 1

Если они являются именами файлов, хорошим выбором будет символ, который запрещен именами файлов. Предложения до сих пор включали , | &, которые обычно разрешены в именах файлов и, следовательно, могут приводить к двусмысленности. /, с другой стороны, обычно не разрешается, даже в 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 файла.

Ответ 2

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

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  = "!" / "$" / "&" / "'" / "(" / ")"
             / "*" / "+" / "," / ";" / "="

Ответ 3

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

Это одна общая проблема. Как я справился с этим: я создал метод, который принял список строк, а затем нашел символ, который не был ни в одной из строк. (Я сделал это путем простой конкатенации строк, а затем для тестирования различных символов.) Как только символ был найден, объединил все строки вместе, но также добавил строку с символом разделения. Таким образом, в данном вопросе одним из примеров является: 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 Но так как я фактически использую метод, который гарантирует, что мой разделительный символ не находится в остальных строках, он безопасен. Это была небольшая работа, чтобы создать первый раз, но я использовал его много раз в различных приложениях.

Ответ 7

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

Ответ 8

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