所以我使用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());
}
答案 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通过一系列查询字符串传回,重建它们很重要。上面的代码工作正常。