rest - 在 ServiceStack 中组合 URL 和 POST 变量

标签 rest routes servicestack

我正在尝试将现有的 WCF Rest API 转换为 ServiceStack,但一开始就遇到了问题:

[Route("foo/{userId}","POST")]
public class MyInputModel : IReturnVoid
{
    public string userId { get; set; }
    public SomeOtherObject properties { get; set; }
}

这里的目的是我将在 url 中提供 userId,并在帖子正文中提供 SomeOtherObject 的实例。我得到的错误是

<Message>Could not deserialize 'application/xml' request using MyInputModel'
Error: System.Runtime.Serialization.SerializationException: 
Error in line 1 position 42. Expecting element 'MyInputModel' 
from namespace 'blahblahblah'.. Encountered 'Element'  with name 
'SomeOtherObject', namespace 'http://blahblahblah'. 

我唯一能想到的就是将我的 xml 包装在 MyInputModel 中以使序列化器满意。这实际上并不是向后兼容的选项。

我还可以将 SomeOtherObject 修改为顶级输入模型,并在其中放置一个 UserId 属性,但这也感觉不太理想,因为它是一个贯穿始终的对象api,并且实际上与用户 ID 无关。它也已经是独立出版的,因此在那里进行更改将是痛苦的。

有什么方法可以表明发布数据的根元素将是 SomeOtherObject 而非 MyInputModel 吗?在 WebApi 中,这将使用 [FromBody] 属性等。 servicestack 有类似的东西吗?

最佳答案

DTO 的目的是自动生成有线格式,这就是 ServiceStack 的原因。要求请求 DTO 与传入请求的形状相匹配。 ServiceStack 如此高效的部分原因在于它是一个代码优先的 Web 服务框架,鼓励从 C# 开始并向外转换,即您的客户端应该绑定(bind)到您的 Web 服务输出,而不是相反将代码优先模型映射到现有架构输入。

话虽如此,Serialization / Deserialization wiki page列出了用您自己的方法覆盖 ServiceStack 的默认请求绑定(bind)的不同方法。

访问任何服务或过滤器中的 HTTP 请求变量

并非所有内容都需要映射到 DTO,因为仍然可以从 IHttpRequest 访问任何 HTTP 变量可从任何服务或过滤器获取,即:

base.Request.QueryString
base.Request.FormData
base.Request.Headers[name]
base.Request.PathInfo
base.Request.AbsoluteUri

关于rest - 在 ServiceStack 中组合 URL 和 POST 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14987069/

相关文章:

java - 如何使用 REST 调用返回 List<MyObject>?

ruby-on-rails - 在 url 中显示类别名称的路由

c# - 安全地为 IIS 加载服务

javascript - WordPress block : async REST calls in registerBlockType edit function

java - 使用 JAVA 连接到 JIRA REST API 时握手失败

c# - ASP.NET MVC 路由返回 null

asp.net-mvc - 优化性能或属性路由和路由表

c# - ServiceStack 自定义用户身份验证

c# - ServiceStack 中是否有任何等效于 ValidateAntiForgeryToken 的东西?

java - 使用 REST api 下载 XML 文件