WCF Restful服务的GET/POST请求

8
我可以像这样做吗?
[OperationContract]    
[WebInvoke
  (  
    Method = "POST",
    ResponseFormat = WebMessageFormat.Json,
    RequestFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.Bare,
    UriTemplate = "/abc{integerParam}"
  )
]
ResultStruct abc( int integerParam, CustomClass secondParam );

这里的想法是我可以在URL中传递第一个参数(整数),但第二个参数来自POST。这是否可能?

我从WCF REST开始,不确定参数如何分配。任何指针都将有所帮助,谢谢。


你必须使用 WCF 吗? - Petar Vučetin
请查看http://stackoverflow.com/questions/5431669/rest-wcf-service-consume-querystring-parameters - Mike Perrenoud
是的,必须使用WCF。@Mike,这个例子并不完全符合我的要求,它只使用了查询字符串。我想用查询字符串进行POST请求。 - ASR
1
好的,请看这个。它们有发布的正文并接收查询参数。https://dev59.com/0WXWa4cB1Zd3GeqPN43i - Mike Perrenoud
谢谢,这正是我一开始想到的,要么从代码中访问查询字符串或者使用POST方法,但我想听听第二个意见。感谢您的帮助。 - ASR
1个回答

25

可以的,这里有来自RESTful Web Services设计与构建指南的内容。

[ServiceContract]
public partial class BookmarkService
{
    [WebInvoke(Method = "PUT", UriTemplate = "users/{username}")]
    [OperationContract]
    void PutUserAccount(string username, User user) {...}

    [WebInvoke(Method = "DELETE", UriTemplate = "users/{username}")]
    [OperationContract]
    void DeleteUserAccount(string username) {...}

    [WebInvoke(Method = "POST", UriTemplate = "users/{username}/bookmarks")]
    [OperationContract]
    void PostBookmark(string username, Bookmark newValue) {...}

    [WebInvoke(Method = "PUT", UriTemplate = "users/{username}/bookmarks/{id")]
    [OperationContract]
    void PutBookmark(string username, string id, Bookmark bm) {...}

    [WebInvoke(Method = "DELETE", UriTemplate = "users/{username}/bookmarks/{id}")]
    [OperationContract]
    void DeleteBookmark(string username, string id) {...}
    ...
}
对我而言,这种设计RESTful Web服务的方法非常糟糕。这个ServiceContrcat是:
- 难以维护,具有脆弱的远程接口 - 必须创建太多方法 - 缺乏多态性
我相信,远程接口应该是稳定和灵活的,我们可以使用基于消息的方法来设计Web服务。
您可以在此处找到详细说明:使用WCF构建基于消息的RESTful Web服务,代码示例在此处:Nelibur,Nelibur nuget包在此处

1
是的,我要挖坟这篇帖子;有些事情值得指出。我阅读了此答案中链接的CodeProject文章,您在代码中创建了一个超级通用、灵活的接口,做得非常棒。但是,您并没有创建一个符合RESTful接口的接口。有关使API符合RESTful的特定原则,而IJsonService毫无疑问不是RESTful服务定义。没有什么能阻止您继续使用那种API创建风格,但您不能称其为RESTFul。非常酷的代码... - TSmith
对我而言,这是一种范式,而不是实现。车轮就是汽车吗?不是的,但是加上其他车轮等等就成为了汽车... IJsonService也是如此。RESTful服务是一种范式,描述了服务应该如何行为,而不是实现方式。https://en.wikipedia.org/wiki/Representational_state_transfer - GSerjo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接