使用application / x-www-form-urlencoded的HTTPWebResponse

时间:2012-11-07 10:40:36

标签: c# httpwebresponse

所以我使用application / x-www-form-urlencoded作为我的内容类型发送了一个HTTPWebRequest。我认为这意味着响应将以类似的类型返回? (编辑:现在已被告知情况并非如此)

我的问题是这个。如何访问响应中返回的不同键/值对。到目前为止我的代码看起来像这样。我当然可以读取字符串但肯定有更好的方法来访问数据,而不是将字符串拆开。

    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个不同的信息,我怎么能读出来?

编辑:我刚检查过,数据以text / plain的形式返回。如何轻松处理?

编辑:通过streamreader检索的响应字符串是:

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}
编辑:似乎这段代码让我分道扬..我能够将响应分解为List并逐行解决。但它仍然不是一个完美的解决方案。

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

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

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

2 个答案:

答案 0 :(得分:1)

这有点快,又脏,但你可以把它解析成这样的字典;

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);

不确定这是多么强大,但它应该是一个良好的开端。

修改:已更新以处理值中的'='字符。

答案 1 :(得分:0)

所以我的情况有点专注,如果响应不包含某些单词,如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通过一系列查询字符串传回,重建它们很重要。上面的代码工作正常。