#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 »