2010-04-08 4 views
1

Я занимаюсь разработкой службы REST, поэтому запрос может быть что-то вроде этого:Лучший способ управления и сравнить строки

/Data/Главная/Таблица = Клиенты/

Мне нужно, чтобы получить сегменты один за другим, и для каждого сегмента я решаю, какой объект я буду использовать, после того, как я передам этому объекту остальную часть запроса, чтобы он мог решить, что делать дальше. В основном, запрос REST - это путь по дереву: P

Это подразумевает множество операций со строками (в зависимости от сложности запроса), но StringBuilder полезен только для конкатенаций и удаления, вы не можете выполнять поиск с помощью IndexOf или аналогичного.

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

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 [] вместо строк и реализует методы, которые я хочу? Или должно быть хорошо с этим? Возможно, регулярные выражения?

UPDATE:

выше класс лишь небольшой aproximation, я все еще работаю над этим, и я должен разобрать более сложные узоры.

Я не могу использовать WCF REST или предопределенные пути (например, сопоставить регулярное выражение с конкретным методом), поскольку формат запроса может быть изменен пользователем во время выполнения. Поэтому он должен разбираться шаг за шагом.

Я не могу использовать String.Split, потому что, например, запрос может быть: «Data/Search = '01/01/2008»/«Независимо».

ответ

1

Вы можете попробовать регулярное выражение, как это:

var input = "/Data/Main/Table=Customers/"; 
var regex = new Regex(@"\w+?/"); 
var matches = regex.Matches(input); 
foreach (var match in matches) 
{ 
    Console.WriteLine(match.ToString()); 
} 
Console.ReadKey(); 

Кроме того, вы можете посмотреть в System.Web .Routing namespace ...

1

Эта проблема требует регулярных выражений. Вы должны иметь возможность написать краткое регулярное выражение, чтобы вытащить все группы в этом пути за один снимок. Однако это может быть или не быть быстрее.

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

(Кстати, я должен был бы предположить, что вам будет гораздо приятнее трактовать ваш путь как IEnumerable<string>, генерируя каждый уровень пути по очереди, вместо того, чтобы иметь класс с внутренним состоянием и метод GetNext(), как вы продемонстрировали.)

8

Если вы не используете его. Я хотел бы проверить здесь

http://msdn.microsoft.com/en-us/netframework/cc950529.aspx

WCF обрабатывает реализации REST для вас. Не нужно разбирать URL.

Если необходимо разобрать запрос вручную, я бы использовать

string[] queryParts = query.Trim('/').Split('/'); 

Вы можете пройти через каждую часть по отдельности, без необходимости использовать IndexOf.

метод

String.split: http://msdn.microsoft.com/en-us/library/system.string.split.aspx

Если вы не собираетесь использовать WCF, и это REST реализация, что вы собираетесь хотите сделать, это поместить переменную информацию в параметрах строки запроса

/Data/Main/Table=Customers/ 

действительно должно быть:

/Data/Main?Table=Customers 

или

/Data/Main/Table/Customers 

Вам понадобится способ отделить маршрут маршрута от переменных запроса. Сложность должна быть частью строки запроса, а не частью базового URI. Затем вы можете выделить переменные после? и выделите каждое выражение запроса, разделив на &.

string[] uriAndQueryItems = query.Split('?'); 

if(uriAndQueryItems.Length > 1) 
{ 
    foreach(string queryItem in uriAndQueryItems.Split('&')) 
    { 
    //do something here. 
    } 
} 
+0

Если вы разделили на '/', по умолчанию у вас будут пустые записи в ваших результатах ... –

+0

@Reed После того, как я нажал save, я увидел ваш и понял, что пропустил его. (хотя плохое копирование, хотя). – kemiller2002

+0

Посмотрите, что я обновил, это мое плохое, чтобы не дать больше деталей, извините: P – vtortola

1

простой один String.split - или я что-то отсутствует

Смежные вопросы