簡體   English   中英

使用應用程序/ x-www-form-urlencoded的HTTPWebResponse

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM