Объединение URI и путей

#c# #html #uri #html-agility-pack

Вопрос:

Я перестраиваю приложение, чтобы использовать HTTP-прокси PHP (для кэширования) вместо фактического сервера API, приложение в настоящее время объединяет URI сервера и путь с кодом:

 methodUri = new Uri(apiUri, method.Path)
 

Где:

  • апиУри = «http://api.eve-online.com/» (Система.Объект Uri)
  • метод.Путь = «/char/Обучение навыкам.xml.aspx» (строка)

Результатом приведенного выше утверждения является

 "http://api.eve-online.com/char/SkillIntraining.xml.aspx" (System.Uri Object)
 

Чтобы использовать прокси-сервер PHP HTTP, запрос должен быть изменен следующим образом

  • апиУри = «http://www.r-s.co.uk/eproxy.php» (Система.Объект Uri)
  • метод.Путь = «/char/Обучение навыкам.xml.aspx» (строка)

Результат, которого я ожидал, был:

 "http://www.r-s.co.uk/eproxy.php/char/SkillIntraining.xml.aspx" (System.Uri Object)
 

Однако результат, который я получаю, таков:

 "http://www.r-s.co.uk/char/SkillIntraining.xml.aspx" (System.Uri Object)
 

Я понимаю, что это правильная функциональность Uri конструктора(Uri, строка), мой вопрос в том, какую функцию или конструктор лучше использовать вместо нее, чтобы получить ожидаемый результат? Я попытался удалить ведущий «/» в методе.Путь, ведущий от абсолютного пути к относительному пути, однако это не помогло.

ПРИМЕЧАНИЕ: оба решения, приведенные ниже, работают, однако система.UriBuilder предоставляет более надежный механизм для объединения URI и путей и в моем случае привел к меньшему количеству изменений в ресурсах, чем использование System.Uri. Если бы у меня был выбор, я бы отметил оба ответа как правильные.

Ответ №1:

Не используйте объект Uri, используйте UriBuilder — он намного лучше справляется с отсутствующими косыми чертами

Так

 Uri apiUri = new Uri("http://www.r-s.co.uk/eproxy.php");
string methodPath = "/char/SkillIntraining.xml.aspx";

System.UriBuilder uriBuilder = new System.UriBuilder(apiUri);
uriBuilder.Path  = methodPath;

Console.WriteLine(uriBuilder.Uri.ToString());
 

работает так, как ожидалось, и производит http://www.r-s.co.uk/eproxy.php/char/SkillIntraining.xml.aspx

Комментарии:

1. Вы-правильная Система. UriBuilder-это более надежный способ создания URI, спасибо.

2. Обратите внимание, что путь будет закодирован по URL-адресу, поэтому, если он содержит строку запроса, то ? и amp; символы будут закодированы. Это слабое место в описанном методе.

3. UriBuilder имеет отдельное свойство запроса для строк запроса, которое рекомендуется, поскольку оно правильно обрабатывает кодировку символов для этого варианта использования.

4. Точно, у меня вошло в привычку анализировать UriBuilder. Запрос, добавление параметров запроса, а затем установка запроса построителя, равного построенной коллекции NameValueCollection.

Ответ №2:

Добавьте завершающий «/» в apiUri и удалите начальный «/» из метода.Путь:

 Uri apiUri = new Uri("http://www.r-s.co.uk/eproxy.php/");
string path = "char/SkillIntraining.xml.aspx";
Uri uri = new Uri(apiUri, path);
Console.WriteLine(uri.ToString());
 

Напечатает:

 http://www.r-s.co.uk/eproxy.php/char/SkillIntraining.xml.aspx
 

Комментарии:

1. Разве нет инструмента, который бы решил эту проблему добавления и вычитания «/» с одной или другой стороны ?

2. Если вы ставите начальную косую черту на добавляемый бит, конструктор Uri считает, что он находится относительно базы, поэтому вы получаете » base.com/bit-you-are-adding.html «, если вы оставите начальную косую черту, предполагается, что она относится к исходному Uri, что дает вам » base.com/OriginalUri/bit-you-are-adding.html »