httpgetrequest uri, закодированный в iso-8859-2

Здравствуйте, я потратил целую вечность, ища форумы сообщества, чтобы найти рабочее решение. Это выглядит просто, мне нужно отправить HTTP-запрос с передачей аргументов методом GET, но для службы на стороне сервера требуется URI, закодированный в ISO-8895-2. Я использую.NET System.net класс HttpWebRequest. Мой код:

String myURI = (this._services + "?" + this._request);

HttpWebRequest request = HttpWebRequest.Create(myURI) as HttpWebRequest;
request.ContentType = "application/x-www-form-urlencoded, charset=iso-8859-2";
request.Method = "GET";
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
this._respStream = response.GetResponseStream();

Теперь вопрос в том, как кодировать строку myURI в ISO-8859-2. Если я делаю что-либо, строка представляется как UTF-8. Я попытался пару преобразований, описанных в этом форуме, см. Пример:

System.Text.Encoding iso_8859_2 = System.Text.Encoding.GetEncoding("iso-8859-2");
byte[] iso592 = iso_8859_2.GetBytes(myURI);
String isoURI = iso_8859_2.GetString(iso592, 0, iso592.Length);

Последовательность байтов iso592 всегда одинакова, даже когда я использовал кодировку utf-8 или windows-1250. Я читал некоторые статьи, что строка.NET всегда представляет как Unicode. Так что же делать сейчас. Есть ли способ, как создать экземпляр WebRequest с URI в кодировке ISO? Когда я переключаюсь на метод POST, а затем передаю данные в заголовок HTTP следующим образом:

Encoding iso_8859_2 = System.Text.Encoding.GetEncoding("iso-8859-2");
byte[] isoData = iso_8859_2.GetBytes(getUrl);

HttpWebRequest request = HttpWebRequest.Create(this._services) as HttpWebRequest;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded; charset=iso-8859-2";
request.ContentLength = isoData.Length;
Stream header = request.GetRequestStream();
header.Write(isoData, 0, isoData.Length);
header.Close();

все работает нормально, но я должен использовать метод GET.

1 ответ

Про процентное кодирование

Проблема здесь

... Схемы URI... должны преобразовывать все остальные символы в байты в соответствии с UTF-8, а затем кодировать эти значения в процентах.

Таким образом, вы не можете использовать стандартные методы для достижения цели. Рассматриваемый метод HttpWebRequest.Create(myURI), который кодирует запрос и делает его UTF-8 (и%-кодированным). Чтобы избежать этого, вам нужно вручную%-кодировать ваши данные в запросе, как двоичные данные, перед использованием HttpWebRequest.Create

Вот мой пример. Сначала я написал простую функцию, которая выполняет двоичное кодирование%:

private string URLEncodeBin(byte[] bytes)
{
    string s = "";
    foreach (byte b in bytes) // encoding every byte
        s += "%" + b.ToString("X2"); // format - 2 digits HEX
    return s;
}

А потом я использовал это так

// creating %-encoded data from iso-8859-2 string
System.Text.Encoding iso_8859_2 = System.Text.Encoding.GetEncoding("iso-8859-2");
byte[] bytes = iso_8859_2.GetBytes("ĄĽŚŠŤŹŽąľśˇšťźž"); // for example
string data=URLEncodeBin(bytes);

// forming request
this._request = "a=" + data;

String myURI = (this._services + "?" + this._request);
HttpWebRequest request = HttpWebRequest.Create(myURI) as HttpWebRequest;
request.Method = "GET";
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
this._respStream = response.GetResponseStream();

Вы должны кодировать только параметры, а не весь запрос. А также request.ContentType = "application/x-www-form-urlencoded, charset=iso-8859-2"; бессмысленно, потому что у вас нет контента, только URL.

Идея абсолютно независима от платформы, я не знаю, почему никто не понял это.

Другие вопросы по тегам