[英]HTTPWebResponse using application/x-www-form-urlencoded
因此,我使用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());
}
这有点麻烦,但是您可以将其解析为如下所示的Dictionary;
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);
不知道这有多健壮,但这应该是一个好的开始。
编辑:更新为处理值中的'='字符。
所以我的案例有点专门,因为我总是知道如果响应中不包含诸如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的情况下,重建它们很重要。 上面的代码工作正常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.