HTTPWebResponse с использованием application/x-www-form-urlencoded

Поэтому я отправил HTTPWebRequest, используя application/x-www-form-urlencoded в качестве типа контента. Я предполагаю, что это означает, что ответ будет возвращен в аналогичном типе? (РЕДАКТИРОВАТЬ: теперь сказали, что это не так)

Мой вопрос заключается в следующем. Как получить доступ к различным парам ключ/значение, возвращаемым в ответе. Мой код пока выглядит так. Я, конечно, могу прочитать строку, но, безусловно, есть лучший способ получить доступ к данным, кроме разрыва строки на части.

    HttpWebResponse response = SendPOSTRequest("https://site/page?Service=foo", content.ToString(), "", "", true);

    string responseCode = response.StatusCode.ToString();
    string responseStatusDescription = response.StatusDescription;

    StreamReader sr = new StreamReader(response.GetResponseStream());

    string result = sr.ReadToEnd();

Я попытался использовать XML/linq для чтения элементов в XDocument, но, конечно, он не возвращается в форме XML.

Предположим, у меня есть 3 или 4 разных фрагмента информации, как я могу их прочитать?

РЕДАКТИРОВАТЬ: я только что проверил, и данные возвращаются как текстовые/обычные. Как это можно легко обработать?

РЕДАКТИРОВАТЬ: Строка ответа после получения через потоковое чтение:

VPSProtocol=2.23
Status=OK
StatusDetail=Server transaction registered successfully.
VPSTxId={FDC93F3D-FC64-400D-875F-0B7E855AD81F}
SecurityKey=*****
NextURL=https://foo.com/PaymentPage.asp?TransactionID={875F-0B7E855AD81F}

РЕДАКТИРОВАТЬ: кажется, что этот фрагмент кода частично помогает мне. Я могу разбить ответ на список и адресовать его построчно. Хотя это все еще не идеальное решение.

            StreamReader sr = new StreamReader(response.GetResponseStream());

            List<string> str = new List<string>;

            while (sr.Peek() >= 0)
            {
                str.Add(sr.ReadLine().ToString());
            }

person CSharpened    schedule 07.11.2012    source источник
comment
Сервер может вернуть что угодно, независимо от типа содержимого запроса.   -  person Esailija    schedule 07.11.2012
comment
Покажите нам, как выглядит ответ, тип контента точно не говорит нам, что в нем содержится (XML, CSV, JSON и т. д.).   -  person tpeczek    schedule 07.11.2012
comment
Я показал ответ в ОП. У меня нет оригинального ответа, я не думаю. Я все равно не смог найти его в объекте ответа.   -  person CSharpened    schedule 07.11.2012


Ответы (2)


Это немного быстро и грязно, но вы можете просто разобрать его в словарь, подобный этому;

var parsed = result.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None)
    .Select(x =>
    { 
        int split = x.IndexOf('=');
        return new
        {
            Key = x.Substring(0, split),
            Value = x.Substring(split + 1, x.Length - (split + 1))
        };
    }).ToDictionary(k => k.Key, v => v.Value);

Не уверен, насколько это надежно, но это должно быть хорошим началом.

Изменить: обновлено для обработки символа '=' в значении.

person Christopher McAtackney    schedule 07.11.2012
comment
Спасибо, Крис. Как вы говорите, это не очень удобно, но похоже, что оно должно работать для текстового/простого типа контента. Похоже, мне придется написать код обработки для различных возможных значений ContentType и соответствующим образом обработать их все. Моя идея List‹string› работает по тому же принципу, что и ваш словарь, но не предлагает разделение имени и значения переменной. - person CSharpened; 07.11.2012
comment
Только что проверил код, и он выдал исключение индекса за пределами. Просто на голову. Я думаю, что проблема может заключаться в том, что одна из строк имеет часть символа =, так как это строка запроса в URL-адресе. - person CSharpened; 07.11.2012
comment
Хех, да - это то, на что я намекал, говоря, что это ненадежно :) Я отредактировал его так, чтобы он обрабатывал символы '=' в значении. Чуть более громоздкий, но со своей задачей справляется. - person Christopher McAtackney; 07.11.2012

Так что мой случай был немного специализированным, так как я всегда знал, с чем мне придется иметь дело, если ответ не содержит определенных слов, таких как INVALID или MALFORMED. Грязное исправление для меня, чтобы получить другие данные из текстового/простого ответа, было достигнуто следующим образом:

string responseCode = response.StatusCode.ToString();

string responseStatusDescription = response.StatusDescription;

StreamReader sr = new StreamReader(response.GetResponseStream());

string result = sr.ReadToEnd();

string[] parsed = result.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.RemoveEmptyEntries);

List<string> str = parsed.ToList();
Dictionary<string, string> dictionary = new Dictionary<string, string>();

foreach (string s in str)

{

string[] ss = s.Split('=');

    if (ss.Count() == 2)
    {
        dictionary.Add(ss[0], ss[1]);
    }
    else
    {
        string value = "";

        for (int i = 0; i < ss.Count(); i++)
        {
            switch (i)
            {
                case 0:
                {
                    break;
                }
                case 1:
                {
                    value += ss[i];
                    break;
                }
                default:
                {

                    value += "=" + ss[i];

                    break;
                }
            }
        }

    dictionary.Add(ss[0], value);
    }
}

Оператор switch был введен, потому что в случае возврата URL-адреса с серией строк запроса было важно восстановить их. Код выше работает нормально.

person CSharpened    schedule 07.11.2012