【问题标题】:Return XML document with REST API使用 REST API 返回 XML 文档
【发布时间】:2015-05-12 09:51:08
【问题描述】:

我想从 rest api 请求中返回一个 xml 文档:

[HttpPost]
public string getClassXml(HttpRequestMessage req)
{
     var response = Request.CreateResponse(HttpStatusCode.OK);
     var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
     ClassXML classid = new ClassXML();
     XmlDocument doc = new XmlDocument();

     try
     {
         var data = req.Content.ReadAsStringAsync().Result;
         classid = serializer.Deserialize<ClassXML>(data.ToString().Trim());
     }
     catch (Exception ex)
     { 
         throw new Exception(ex.Message);
     }

     string path = ASDb.ReadValue("SELECT definitionxml FROM alclass WHERE classid='" + classid.classID + "'").ToString();

     XmlTextReader reader = new XmlTextReader(AppDomain.CurrentDomain.BaseDirectory + "Resource\\" + percorso);
     reader.Read();
     doc.Load(reader);

     return doc.innerXml;
}

但是通过这种方式我得到一个字符串,我想要一个 XmlDocument 而不是一个字符串。我也尝试返回 XmlDocument 文档,但它给了我一个错误:他的 'ObjectContent`1' 类型未能序列化内容类型 'application/xml; 的响应正文;字符集=utf-8'。 你有什么想法吗?

【问题讨论】:

  • 你为什么不从消费端方法得到的 xml 制作 XmlDocument。
  • 在创建 web 服务时不建议返回 XmlDocument 之类的复杂类;如果有人从另一种语言(如 PHP)访问您的服务,那么他们将无法使用复杂类。最好保持原样,以便 API 对其他语言开放。如果你不希望它是开放的,那你为什么还要使用 REST 呢?

标签: c# xml rest


【解决方案1】:

正如几秒钟前有人在这里写的(但随后删除了他的答案),问题是 XmlDocument 不可序列化,如果您使用 XmlElement 则可以。这是我所做的:

[HttpPost]
public XmlElement getClassXml(HttpRequestMessage req)
{
    var response = Request.CreateResponse(HttpStatusCode.OK);
    var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
    ClassXML classid = new ClassXML();
    XmlDocument doc = new XmlDocument();

    try
    {
        var data = req.Content.ReadAsStringAsync().Result;
        classid = serializer.Deserialize<ClassXML>(data.ToString().Trim());
    }
    catch (Exception ex)
    { 
        throw new Exception(ex.Message);
    }

    string path = ASDb.ReadValue("SELECT definitionxml FROM alclass WHERE classid='" + classid.classID + "'").ToString();

     XmlTextReader reader = new XmlTextReader(AppDomain.CurrentDomain.BaseDirectory + "Resource\\" + percorso);
     reader.Read();
     doc.Load(reader);
     XmlElement element = doc.DocumentElement;

     return element;
}

【讨论】:

    【解决方案2】:

    也许问题不在于您的 API 层,而是当您尝试使用 XmlTextReader 时?

    XmlTextReader reader = new XmlTextReader(AppDomain.CurrentDomain.BaseDirectory + "Resource\\" + percorso);

    您尝试读取的 XML 是什么样的?你检查过它的格式是否正确吗?

    关于“使用 REST API 返回 XML 文档”,我建议您将 XML 文档输出为具有适当 MIME 类型的字符串,执行以下操作:

    [HttpPost]
    public HttpResponseMessage getClassXml(HttpRequestMessage req)
    {
    
         ...
    
         XmlTextReader reader = new XmlTextReader(AppDomain.CurrentDomain.BaseDirectory + "Resource\\" + percorso);
         reader.Read();
         doc.Load(reader);
    
         HttpResponseMessage response = new HttpResponseMessage { Content = new StringContent(doc.innerXml, Encoding.UTF8,"application/xml") };
         return response;
    }
    

    REST API 输出应映射到标准互联网 mime 类型(例如 JSON 数据、图像、文本等 - 而不是 XmlDocument)。任何使用 REST API 的东西都可以获取文本并在必要时将其转换为 XmlDocument。

    顺便说一句,您似乎甚至没有使用您提供的示例中的一半代码,您可能可以清理它:

    string path = ASDb.ReadValue("SELECT definitionxml FROM alclass WHERE classid='" + classid.classID + "'").ToString();
    

    【讨论】:

      【解决方案3】:

      抱歉,如果我现在想从 HttpPost 更改为 HttpGet,我将如何获取以下 url 中的参数:http://localhost/arcosat/api/ws/GetClassXml?classid=myclass 我想获取“myclass”字符串,但使用req.Content.ReadAsStringAsync().Result 它不再起作用了

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-22
        • 2020-10-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多