【问题标题】:Post XML in body of rest call using Rest Sharp使用 Rest Sharp 在休息调用正文中发布 XML
【发布时间】:2012-11-21 13:57:41
【问题描述】:

我在尝试使用 Rest Sharp 进行 POST 时遇到问题。我正在尝试调用不完全符合现代标准的 Web 服务,并且我需要能够在我的帖子正文中发布请求 XML。

如果我只是对 RestRequest 对象执行 request.AddBody(xmlObject),则会将一个名为 text/xml 的参数添加到请求中。在这种情况下,我收到来自服务器的错误响应,提示“抛出异常:prolog 中不允许内容”。这告诉我服务器正在尝试处理参数的键 (text/xml=) 以及值。

当我在 chrome 中使用 REST 控制台并在 RAW 正文字段中使用所需的 xml 请求时,一切都按预期工作。

关于如何使用 Rest Sharp 进行这项工作的任何想法?

编辑:看起来我需要使用 request.AddFile("name", bytes_to_add, "file_name")。但是,当我尝试这样做时,我得到一个异常(“System.InvalidOperationException:在写入开始后无法设置此属性。”),它看起来像一个从未解决过的带有 RestSharp 的issue。我可能只需要使用 HttpWebRequest 库发出请求。

【问题讨论】:

  • 你能发布序列化请求的样子吗?最简单的方法是使用 Fiddler 捕获它。该异常通常意味着在请求中打开 标记之前有一些数据。
  • 我通过使用 HttpWebRequest 并直接写入请求流来使其工作。我仍在使用 Rest Sharp 序列化程序,所以我知道该对象已正确序列化。但我不喜欢直接使用 HttpWebRequest。所以我克隆了 Rest Sharp 代码,看看我是否能弄清楚如何修复抛出的异常。
  • 我认为这是stackoverflow.com/questions/5095692/…的副本

标签: c# xml restsharp


【解决方案1】:

你可能想多了。 RestSharp.AddBody 将对象作为参数,并使用 JSON 或 XML 序列化程序自动将其序列化为正确的格式,具体取决于 RequestFormat 属性。

直接添加 XML 没有意义。 REST 的部分魔力在于它支持多种格式,而不仅仅是 XML。 RestSharp 在编写时就考虑到了这一点,因此它的所有公共接口都只使用 POCO。

简单的解决方案就是不序列化对象。您不想添加 xmlObject,只需将您的真实 C# 对象传递给 AddBody 方法并让它处理序列化。

【讨论】:

  • 我应该更清楚地命名传递给 AddBody 的对象。我自己并没有序列化对象,我应该将其称为 requestModel 或类似的名称。 Rest Sharp 序列化效果很好,但服务器响应我帖子中提到的错误。
  • 当我想在出现故障且 BizTalk 是客户端的情况下进行调试时,直接发布 xml 非常有意义。
  • @ThomasEyde 我不认为直接发布 XML 是解决问题的正确方法。您可以使用自定义序列化程序来查看或控制正在发生的事情,或者使用 Fiddler 或 Wireshark 之类的东西来查看它。在尝试发送请求的同一应用程序代码中担心 XML 序列化是一种混合问题(和糟糕的 OO 设计)。
  • @TimCopenhaver,我认为你误解了我的需求:我有一个客户从 BizTalk 调用我的 api。某些事情失败了,他们只能为我提供 xml。现在我必须用那段 xml 进行测试/调试,我想用代码来做。主要是因为我认为这比设置提琴手更容易,还因为可以在重新启动之间保存代码。这是关于调试,而不是编写 api 客户端。
  • 啊,那我明白你的情况了。确实,对于调试,代码并不总是您的最佳选择。其他工具(例如 SoapUI)已经设计用于处理这种情况,所以我可以理解为什么它们不会将它包含在 RestSharp 中。
猜你喜欢
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多