【问题标题】:How to invoke RESTful WCF service method with multiple parameters?如何使用多个参数调用 RESTful WCF 服务方法?
【发布时间】:2011-01-04 18:51:25
【问题描述】:

我有一个 RESTful WCF 服务,其方法声明如下:

[OperationContract(Name = "IncrementAge")]
[WebInvoke(UriTemplate = "/", Method = "POST", ResponseFormat = WebMessageFormat.Json)]
Person IncrementAge(Person p);

下面是实现:

public Person IncrementAge(Person p)
{
            p.age++;

            return p;
}

因此,它采用 Person 复杂类型,将 age 属性加一,然后使用 JSON 序列化将其返回。我可以通过向服务发送 POST 消息来测试这个东西:

POST http://localhost:3602/RestService.svc/ HTTP/1.1
Host: localhost:3602
User-Agent: Fiddler
Content-Type: application/json
Content-Length: 51

{"age":25,"firstName":"Hejhaj","surName":"Csuhaj"}

这行得通。如果我想要这样的方法怎么办?

Person IncrementAge(Person p, int amount);

所以它会有多个参数。我应该如何构建 POST 消息才能使其正常工作?这可能吗?

谢谢

【问题讨论】:

    标签: .net wcf json rest service


    【解决方案1】:

    您应该使消息正文样式包装,以便您可以在 POST 请求正文中接受多个参数。

    您的方法签名将是:

    [OperationContract(Name = "IncrementAge")]
    [WebInvoke(UriTemplate = "/", Method = "POST",
               ResponseFormat = WebMessageFormat.Json,
               BodyStyle = WebMessageBodyStyle.WrappedRequest)]
    Person IncrementAge(Person p, int amount);
    

    请求的正文将如下所示:

    {"p": {"age":25,"firstName":"Hejhaj","surName":"Csuhaj"}, "amount": 1}
    

    外部 JSON 对象是匿名包装器。

    【讨论】:

      【解决方案2】:

      您可以使用查询字符串参数,

      POST /RestService.svc/Incrementor?amount=23
      {...}
      

      我认为 WCF 签名是:

      [OperationContract(Name = "IncrementAge")]
      [WebInvoke(UriTemplate = "/?amount={amount}", Method = "POST", ResponseFormat = WebMessageFormat.Json)]
      Person IncrementAge(int amount, Person p);
      

      【讨论】:

      • 使用查询参数传递在 POST 请求中作用于的参数对我来说似乎有点奇怪。我会为选择资源(获取或更新)保留查询参数,而不是实际修改资源。
      • 问题是 IncrementAge 返回一个人,所以它与 GET 接壤(即请求资源的特定表示)。当然,该方法更像是一个 RPC 调用......
      猜你喜欢
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      • 2014-03-04
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      相关资源
      最近更新 更多