解决  从API响应读取数据

Alexjames.

众所周知的成员
加入
3月20日,2020年
消息
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读者有选项,将其作为文本等留出。这么多选择。对此的任何指导都会得到很大的赞赏。
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
无论收到的类型如何,您都可以将其存储在类对象中。良好的猫头鹰对象导向方式......

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

Alexjames.

众所周知的成员
加入
3月20日,2020年
消息
65
编程经验
10+
无论收到的类型如何,您都可以将其存储在类对象中。良好的猫头鹰对象导向方式......

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

抱歉,数据通过XML来实现。从我对XML的有限知识来看,它看起来非常复杂,对儿童节点负载。所以我不太确定如何处理这个问题,也没有在C#中尝试这样做。
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
您希望将收到的数据进行反序列化为列表中的数据,以及从列表到SQL Server。您可以从一个LINQ方法完成所有。

因此,如果我理解这一点......要从请求接收数据,请阅读该数据,然后将该数据插入另一个数据库?

无论哪种方式,您都在寻找XMLSerializer类的反序列化。
 

Alexjames.

众所周知的成员
加入
3月20日,2020年
消息
65
编程经验
10+
您希望将收到的数据进行反序列化为列表中的数据,以及从列表到SQL Server。您可以从一个LINQ方法完成所有。

因此,如果我理解这一点......要从请求接收数据,请阅读该数据,然后将该数据插入另一个数据库?

无论哪种方式,您都在寻找XMLSerializer类的反序列化。

嗨毛皮

谢谢您的建议,是的,这正是我需要与XML做些什么。
我已经建立了收到数据的StreamReader,我必须替换所有代码才能使用XMLSerializer吗?或者我可以将已经通过的内容进行了指导?
 

Alexjames.

众所周知的成员
加入
3月20日,2020年
消息
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;
            }
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
您确定您在您的请求中接收XML数据吗?

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

SR. .readtoend() 代替 SR. on line 13.

另请注意,第13行反序列化期望XML读取器而不是流读取器。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,893
地点
切萨皮克,va.
编程经验
10+
或者OP可以直接传递流并绕过流读取器。
 

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
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>
@skydiver. 而且你想知道为什么我更喜欢json eh。  ðÿ™ƒ
 

Alexjames.

众所周知的成员
加入
3月20日,2020年
消息
65
编程经验
10+
您的XmlElement的开始实际上是名为XMLElement的吗?

向我们展示一些没有任何敏感数据的XML?

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

@skydiver. 而且你想知道为什么我更喜欢json eh。  ðÿ™ƒ

嗨牧草,我已经附加了XML文件,因为它是一个完全复杂的XML文件,我之前还没有像之前的任何东西一样。

"另请注意,第13行反序列化期望XML读取器而不是流读取器。"

所以我必须重新编写Stream Reader代码并用XMLReader代码替换它吗?我被认为我可以将已经通过refreener的数据进行了反驳,或者是不可能的吗?
 

附件

  • Response.zip.
    17.4 KB · Views: 6

sh

众所周知的成员
加入
2018年9月5日
消息
1,982
编程经验
10+
我被认为我可以将已经通过refreener的数据进行了反转
取决于您处理您的回复的方式。 Docs建议使用XML读取器,并且DeseriAze方法采用XmlReader。笔记 :
或者OP可以直接传递流并绕过流读取器。
如果没有其他人,我会尝试以后选择它。
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,893
地点
切萨皮克,va.
编程经验
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.)
 

Alexjames.

众所周知的成员
加入
3月20日,2020年
消息
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,893
地点
切萨皮克,va.
编程经验
10+
不,它是读入XML数据的类。通常,类类型名称与XML元素名称匹配,但可以覆盖这一点。您应该花时间阅读XML序列化和反序列化而不是仅在屏幕上投掷代码以查看什么棒。

 
最佳 底部