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}

編集:このコードは途中で私をそこに連れて行ってくれるようです。応答をリストに分割して、1 行ずつアドレス指定することができます。それでも完璧な解決策ではありません。

            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 などの特定の単語が含まれていない場合に何を処理しなければならないかを常に知っているという点で、私のケースは少し専門的でした。text/plain 応答から他のデータを取得するための汚い修正は、次のように達成されました。

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 に答える