2011-01-04 13 views
2

は、私はこの方法でRESTfulなWCFサービスは、次のように宣言している:複数のパラメータを持つ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; 
} 

だから、人の複雑な型を取るいずれかで年齢プロパティをインクリメントし、スピット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メッセージをどのように構築すればよいですか?これは可能ですか?

おかげ

答えて

3

あなたは、クエリ文字列パラメータを使用することができ、

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); 
+0

POSTリクエストで*に作用した引数を渡すためにクエリパラメータを使用することは、私にとっては少し奇妙なようです。実際にリソースを変更*するのではなく、*選択*リソース(取得または更新)のためのクエリパラメータを予約します。 – kpozin

+0

@kpozinなぜですか?その意図は不明ですか? –

+0

問題は、IncrementAgeがPersonを返すため、GETと境界を接している(つまり、リソースの特定の表現を要求している)ということです。ただし、このメソッドはRPC呼び出しのほうが多く... – AshesToAshes

8

あなたがメッセージのボディスタイルはそうを包ん行う必要があります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オブジェクトが匿名のラッパーです。

関連する問題