1

所以我使用 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 条不同的信息,我怎么能读出它们?

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

编辑:通过流读取器检索到的响应字符串是:

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());
            }
4

2 回答 2

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

不确定这有多强大,但它应该是一个好的开始。

编辑:更新以处理值中的“=”字符。

于 2012-11-07T11:15:13.560 回答
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 与一系列查询字符串一起传回,那么重构它们很重要。上面的代码工作正常。

于 2012-11-07T11:43:25.240 回答