REST HttpWebResponse 不返回 xml 数据作为字符串

REST HttpWebResponse not returning xml data as string

首先,我知道这段代码不一定 "safe" 而是非常基础的。我正在学习如何使用 C# 中的 Web 表单使用休息服务(这对我来说都是新主题)。几乎唯一的东西是 2 个用于身份验证凭据的文本框,一个查询文本框和用于发送带有标签的请求的按钮。我只想在文本框中输入 ID1,然后 return 具有该 ID 的条目的名字和姓氏。

我在网上彻底搜索后尝试了很多不同的方法,但似乎无法找出问题所在。

问题: 来自 WebResponse 的 StreamReader 数据没有返回 XML。

问题: 如何 return 我想要的 XML 标签?我需要解析它们吗?如果是,怎么做?

XDoc 版本 return 什么都没有,而直接流 reader 是 return 带有一些数据的字符串,除了不应该存在的数字之外,没有角度括号。下面是现在的代码:

if (QueryTextBox2.Text != "")
        {
            string tableName = "Entry";
            string requestURL = "https://myUrl.com/rest/services/" + tableName;
            HttpWebRequest request = WebRequest.Create(requestURL) as HttpWebRequest;
            request.Method = "POST";
            request.ContentType = "text/xml; encoding:='charset=utf-8'";
            request.Headers["CustomUserName"] = TextBox1.Text;
            request.Headers["CustomPassword"] = TextBox3.Text;

            string xml = "<Entry><ID1>" + QueryTextBox2.Text + "</ID1></Entry>";
            byte[] byteArray = Encoding.UTF8.GetBytes(xml.ToString());
            request.ContentLength = byteArray.Length;
            Stream dataStream = request.GetRequestStream();
            dataStream.Write(byteArray, 0, byteArray.Length);
            dataStream.Close();

            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            if (response.StatusCode == HttpStatusCode.OK) { 

                Stream postData = response.GetResponseStream();
                StreamReader reader = new StreamReader(postData, Encoding.UTF8);
                string result = reader.ReadToEnd();
                Label2.Text = result;

            } else
            {
                Label2.Text = "There was an error: " + response.StatusDescription;

            }
        }
        else
        {
            TextBox2.Text = "Please Enter an ID";
        }

    }
}

我也试过使用:

                XDocument doc = new XDocument();
                using (Stream responseStream = response.GetResponseStream())
                {
                    StreamReader reader = new StreamReader(responseStream, Encoding.UTF8);
                    doc = XDocument.Parse(reader.ReadToEnd());
                    string fname = doc.Root.Element("NameFirst").Value;
                    string lname = doc.Root.Element("NameLast").Value;
                    Label2.Text = fname + lname;

替换整个块:if statusCode == OK。

从 firefox Poster 附加组件return编辑的数据是:

    <?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom">
<title type="text">Search Results</title>
<id>https://myUrl.com/rest/services</id>
<updated>2015-10-07T09:51:32Z</updated>
<link rel="self" type="application/atom+xml" href="https://myUrl.com/rest/services" />
<entry>
<id>https://myUrl.com/rest/services</id>
<Entry>
<ID1>900009</ID1>
<NameLast>Smith</NameLast>
    <NameFirst>Tom</NameFirst>
    <NameTitle></NameTitle>
    <NamePreferred>Alex</NamePreferred>
    <NameWeb>tsmith</NameWeb>
    <NameOther></NameOther>
    <NameInitials></NameInitials>
</Entry></content></entry></feed>

我删除了很多响应数据,因为它太大了,而且大部分都匿名了,所以请记住这一点。

我会使用 System.Net.Http.HttpClient,它有一个更简单的接口来处理 http 请求。

我没有测试过文档解析,只是按照嵌套级别,直到找到你想要的元素。

async void Main()
{
    var textBox2String = "2"

    if (!string.IsNullOrEmpty(textBox2String))
    {
        const string table = "Entry";

        var client = new HttpClient();
        var url = $"https://myurl.com/rest/services/{table}";
        var xml = $"<Entry><ID1>{textBox2String}</ID1></Entry>";

        client.DefaultRequestHeaders.TryAddWithoutValidation("CustomUserName", "username");
        client.DefaultRequestHeaders.TryAddWithoutValidation("CustomPassword", "password");

        var response = await client.PostAsync(url, new StringContent(xml, Encoding.UTF8, "text/xml"));
        var content = await response.Content.ReadAsStringAsync();

        if (response.IsSuccessStatusCode)
        {
            var document = XDocument.Parse(content);
            var entry = document.Root.Element(table);
            var firstName = entry.Element("FirstName").Value;
            var lastName = entry.Element("LastName").Value;

            $"{firstName} {lastName}".Dump();
        }
        else
        {
            Console.WriteLine($"An error occurred processing this request: {content}");
        }
    }
    else
    {
        textBox2String = "Please enter an ID";
    }
}