解决 从API响应中读取数据

已加入
2020年3月20日
留言内容
65
编程经验
10+
大家好

我目前正在使用REST API,并且在读取响应数据时需要一些指导。我在读取此类数据方面的经验非常少,我正在尝试找到最佳方法。

以下是获取API数据的代码。

C#:
 public string ModitarWebRequestCall()
        {
            string apiUrl = "//api.moditar.com/Document/GetContent";
            string username = "JohnDoe";
            string password = "Password123";
            string collection = "ea85fbf3-5858-4348-bcab-08a8f39ad30c";
            string markasread = "False";

            var request = (HttpWebRequest)WebRequest.Create(apiUrl);
            request.Method = "GET";
            request.Accept = "application/xml";

            request.Headers.Add("username", username);
            request.Headers.Add("password", password);
            request.Headers.Add("collection", collection);
            request.Headers.Add("Markasread", markasread);

            string content = string.Empty;
            try
            {
                using (var response = (HttpWebResponse)request.GetResponse())
                {
                    using (var stream = response.GetResponseStream())
                    {
                        using (var sr = new StreamReader(stream))
                        {
                            content = sr.ReadToEnd();
                            sr.Close();
                            Console.WriteLine("Data received from Moditar");
                        }
                    }
                }
                return content;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return null;
            }
        }

我正在使用下面的代码来调用上述方法,这是我需要处理数据的地方。

C#:
        public void ProcessDatafromModitarApi()
        {
            var getData = new ModitarApiConnection();
            getData.ModitarWebRequestCall();
        }

读取此数据的最佳方法是什么?有json,xml读取器选项,将其保留为文本等选项,因此有很多选择。任何对此的指导将不胜感激。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,961
地点
英国
编程经验
10+
更为重要的问题是,获取数据后将如何处理?

这将是您接收和使用哪种格式的决定因素。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,961
地点
英国
编程经验
10+
数据的类型是什么?
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,961
地点
英国
编程经验
10+
无论收到的类型如何,都可以将其存储在类对象中。好的猫头鹰面向对象的方式...

根据收到的数据类型,我可以提供更好的响应。
 
已加入
2020年3月20日
留言内容
65
编程经验
10+
无论收到的类型如何,都可以将其存储在类对象中。好的猫头鹰面向对象的方式...

根据收到的数据类型,我可以提供更好的响应。
嗨道林斯

抱歉,数据以XML格式通过。从我对XML的有限了解来看,子节点的负载看起来相当复杂。所以我不太确定如何处理它,也没有在C#中尝试过类似的事情。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,961
地点
英国
编程经验
10+

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,961
地点
英国
编程经验
10+
您想反序列化接收到的数据到列表中,并从列表到SQL Server。您可以通过一种Linq方法完成所有操作。

所以,如果我理解这一点...您想从请求中接收数据,读取该数据,然后将该数据插入另一个数据库?

无论哪种方式,您都在从XmlSerializer类中寻找反序列化。
 
已加入
2020年3月20日
留言内容
65
编程经验
10+
您想反序列化接收到的数据到列表中,并从列表到SQL Server。您可以通过一种Linq方法完成所有操作。

所以,如果我理解这一点...您想从请求中接收数据,读取该数据,然后将该数据插入另一个数据库?

无论哪种方式,您都在从XmlSerializer类中寻找反序列化。

嗨道林斯

感谢您的建议,是的,这正是我需要对XML进行的操作。
我已经建立了接收数据的StreamReader,是否必须替换所有代码以使用XmlSerializer?还是我可以反序列化已经通过的内容?
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,961
地点
英国
编程经验
10+
已加入
2020年3月20日
留言内容
65
编程经验
10+
我有点在黑暗中摸索,但不确定自己是否正确执行此操作,但是我得到了"root element missing"当我将鼠标悬停在异常上时出错。

C#:
            string content = string.Empty;
            try
            {
                using (var response = (HttpWebResponse)request.GetResponse())
                {
                    using (var stream = response.GetResponseStream())
                    {
                        using (var sr = new StreamReader(stream))
                        {
                            content = sr.ReadToEnd();

                            XmlSerializer serializer = new XmlSerializer(typeof(XmlElement));
                            content = (string)serializer.Deserialize(sr);

                            sr.Close();
                        }
                    }
                }
                return content;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return null;
            }
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,961
地点
英国
编程经验
10+
您确定您的请求中接收到XML数据吗?

由于第13行,第10行是多余的。

使用 sr.ReadToEnd() 代替 sr on line 13.

还要注意,第13行的Deserialize需要xml读取器,而不是流读取器。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,961
地点
英国
编程经验
10+
XmlElement的开头是否实际上命名为XmlElement?

向我们显示您的一些XML,但没有任何敏感数据?

注意我链接的文档上的用法:
C#:
<?xml version="1.0"?>
<OrderedItem xmlns:inventory="http://www.cpandl.com" xmlns:money="http://www.cohowinery.com">
   <inventory:ItemName>Widget</inventory:ItemName>
   <inventory:Description>Regular Widget</inventory:Description>
   <money:UnitPrice>2.3</money:UnitPrice>
   <inventory:Quantity>10</inventory:Quantity>
   <money:LineTotal>23</money:LineTotal>
</OrderedItem>
@跳伞 并且您想知道为什么我更喜欢Json eh。 🙃
 
已加入
2020年3月20日
留言内容
65
编程经验
10+
XmlElement的开头是否实际上命名为XmlElement?

向我们显示您的一些XML,但没有任何敏感数据?

注意我链接的文档上的用法:

@跳伞 并且您想知道为什么我更喜欢Json eh。 🙃

嗨Sheepings,我已经附加了XML文件,因为它是一个非常复杂的XML文件,之前我还没有使用过类似的东西。

"还要注意,第13行的Deserialize需要xml读取器,而不是流读取器。"

那么,我是否必须重新编写流阅读器代码并将其替换为XMLreader代码?我以为我可以反序列化已经通过流读取器的数据,或者那不可能吗?
 

附件

  • response.zip
    17.4 KB · Views: 1

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,961
地点
英国
编程经验
10+

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,571
地点
弗吉尼亚州切萨皮克
编程经验
10+
您甚至不必将其流传输到内存流中(除非您计划多次对同一流进行反序列化)。

This (using the new C# 8.0 using) would be sufficient:
C#:
using var response = (HttpWebResponse)request.GetResponse();
using var stream = response.GetResponseStream();
var serializer = new XmlSerializer(typeof(OrderedItem));
return (OrderedItem)serializer.Deserialize(stream);
(If you have an older version of C#, obviously use the scoped version of using.)
 
已加入
2020年3月20日
留言内容
65
编程经验
10+
您甚至不必将其流传输到内存流中(除非您计划多次对同一流进行反序列化)。

This (using the new C# 8.0 using) would be sufficient:
C#:
using var response = (HttpWebResponse)request.GetResponse();
using var stream = response.GetResponseStream();
var serializer = new XmlSerializer(typeof(OrderedItem));
return (OrderedItem)serializer.Deserialize(stream);
(If you have an older version of C#, obviously use the scoped version of using.)
谢谢跳伞

我只是被所有不同的选项所困扰,并使自己更加困惑。现在的主要焦点只是使XML数据反序列化。在您的示例中,我假设"OrderedItem"XML文件中的节点是什么?
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,571
地点
弗吉尼亚州切萨皮克
编程经验
10+
否。这是将读取XML数据的类。通常,类类型名称与XML元素名称匹配,但是可以重写。您应该花一些时间阅读有关XML序列化和反序列化的信息,而不是仅仅在屏幕上扔代码以查看问题所在。

 
最佳 底部