Я разрабатываю службу REST, поэтому запрос может выглядеть примерно так:
/ Data / Main / Table = Клиенты /
Мне нужно получить сегменты один за другим, и для каждого сегмента я решу, какой объект я собираюсь использовать, после того как я передам этому объекту остальную часть запроса, чтобы он мог решить, что делать дальше , По сути, запрос REST - это путь к дереву: P
Это подразумевает множество операций String (в зависимости от сложности запроса), но StringBuilder полезен только для конкатенаций и удаления, вы не можете выполнять поиск с помощью IndexOf или аналогичного.
Я разработал этот класс, который удовлетворяет моим требованиям, но проблема в том, что он манипулирует строками, поэтому каждый раз, когда я получаю один сегмент ... Я буду создавать дополнительные строки, потому что String является неизменяемым типом данных:
public class RESTQueryParser
{
String _query;
public RESTQueryParser(String query)
{
_query = query;
}
public String GetNext()
{
String result = String.Empty;
Int32 startPosition = _query.StartsWith("/", StringComparison.InvariantCultureIgnoreCase) ? 1 : 0;
Int32 i = _query.IndexOf("/", startPosition, StringComparison.InvariantCultureIgnoreCase) - 1;
if (!String.IsNullOrEmpty(_query))
{
if (i < 0)
{
result = _query.Substring(startPosition, _query.Length - 1);
_query = String.Empty;
}
else
{
result = _query.Substring(startPosition, i);
_query = _query.Remove(0, i + 1);
}
}
return result;
}
}
Сервер должен поддерживать много вызовов, и запросы могут быть огромными, так что это будет очень повторяющаяся задача. Я действительно не знаю, насколько велико влияние на память и производительность, я только что прочитал об этом в некоторых книгах.
Должен ли я реализовать класс, который управляет Char [] вместо Strings, и реализовать методы, которые я хочу? Или должно быть в порядке с этим? Может быть, регулярные выражения?
UPDATE:
Приведенный выше класс - всего лишь небольшое приближение, я все еще работаю над ним, и мне нужно разобрать более сложные шаблоны.
Я не могу использовать WCF REST или предопределенные пути (например, сопоставить регулярное выражение определенному методу), потому что формат запроса может быть изменен пользователем во время выполнения. Так что надо разбирать шаг за шагом.
Я не могу использовать String.Split, потому что, например, запрос может быть: «Данные / Поиск = '01 / 01/2008 '/ Безотносительно».