URL в квадратных скобках в webClient.DownloadString
Я пытаюсь выполнить http GET с веб-адреса, который требует квадратных скобок в запросе URL - что-то вроде:
string requestconstructor = "http://address:port/datalink?test.a[somestuff]"
System.Net.WebClient webClient = new System.Net.WebClient();
string result = webClient.DownloadString(requestconstructor);
Я попытался установить кодировку веб-клиента на utf8 и ascii, и я попытался заменить квадратные скобки в объявлении строки на \u00b5 и \u00b6 соответственно, чтобы напрямую кодировать их, но ни один из этих методов не отправляет допустимую строку на сервер, Я попытался поместить знак @ перед конструктором запроса в вызове строки загрузки...
Я могу скопировать и вставить именно то, что в кавычках, в веб-браузер, и он отлично работает. Я могу использовать код, который у меня есть, чтобы отправлять запросы к функциям сервера, которые не требуют квадратных скобок, и это тоже работает.
Есть ли способ сделать запрос, используя эти символы?
Спасибо!
Обновлено: я попробовал предложенный код, как вручную, включая escape-коды, так и используя Uri.EscapeDataString, и он все еще не удался. Каждый раз, когда происходит сбой с кодом 500, возвращаемым с сервера, это тот же код, который возвращается, если вы неправильно набрали запрос в строке URL веб-браузера.
Я думаю, что проблема в том, что сервер ожидает, что эти символы не сбежали, и что даже до того, как я попытался сделать это вручную с вашей помощью, веб-клиент мог конвертировать их автоматически? Есть ли способ заставить веб-клиента отправлять строку в точности так, как она поступает, без ее кодирования? Или есть параметр для свойства.encoding, который может передавать [и] в виде плоского текста вместо специальных кодов символов? Это то, что я пытался сделать с @ в моих первоначальных усилиях.
Обновление 2 - я загрузил Fiddler для анализа запросов... и я был прав в своем диагнозе... Когда я набираю URL-адрес в Chrome Fiddler, он показывает, что включает в себя "[вещи]". Когда я загружаю тот же адрес через C#, он выглядит как "%5Bstuff%5D". Поэтому я должен убедить C# просто отправить URL-запрос так, как я его напечатал, не пытаясь быть полезным и заставить его соответствовать веб-стандартам. Я не знаю, как это сделать. Но... я знаю, что мне нужно делать, что-то!
2 ответа
Веб-браузер автоматически его кодирует, а веб-клиент - нет.
Действительный кодированный URI "http://address:port/datalink?test.a%5Bsomestuff%5D"
, Чтобы убрать его из кода, используйте один из методов escape, например.
var path = "http://address:port/datalink";
var query = "test.a[somestuff]";
var uri = path + "?" + Uri.EscapeUriString(query);
С помощью @""
не имеет эффекта, так как влияет только на разбор строкового литерала.
Я наконец нашел древний пост кем-то с той же проблемой! Конструктор Uri(string, boolean) позволяет вам пообещать, что вы уже сделали все побег, даже если вы лжете. Рабочий код здесь -
string address = "http://127.0.0.1:8085/datalink?a=stuff[true]";
Uri uri = new Uri(address, true);
WebClient client = new WebClient();
string reply = client.DownloadString(uri);