2010-06-30 57 views
1

我已經使用WCF和Rest-toolkit在.Net中的新REST服務中成功添加並使用了Get操作。該服務的定義是這樣的:在.Net中使用POST中的POST

[OperationContract] 
[WebGet(UriTemplate = "/{id}")] 
Foo GetFooById(string id); 

我這樣稱呼它從客戶端:

public Foo GetFoo(string id) 
{ 
    var httpClient = new HttpClient("http://127.0.0.1:8000/"); 
    var response = httpClient.Get("foo/" + id); 
    return response.Content.ReadAsDataContract<Foo>(); 
} 

現在我想添加一個POST操作,但你怎麼定義它,以及如何你是否映射參數?

回答

2

爲了POST參數,您需要使用DataContractSerializer將其序列化。 e.g,

在服務器:

[OperationContract] 
[WebInvoke(Method="POST",UriTemplate = "/foos")] 
void PostFoo(Foo foo) {} 

在客戶端:

var foo = new Foo(); 
var content = HttpContentExtensions.CreateDataContract<Foo>(foo); 
var client = new HttpClient("http://example.org/service.svc/foos"); 
client.Post(content) 

請注意,沒有編譯器創建這個代碼的過程中參與,買家當心。

+0

謝謝!聽起來很有希望。但它如何知道foo對象應該使用哪個參數呢?在這種情況下,這很明顯,但是如果有兩個類型爲foo的參數或者字符串會怎樣。你能以某種方式命名參數嗎? – stiank81 2010-07-01 07:00:24

+0

最後一個參數是消息的主體。其他參數將根據URI模板的名稱進行匹配。 – 2010-07-01 12:18:19

+0

「最後一個參數是消息的主體」 - 這是一個通用規則嗎?你不能傳遞多個參數嗎?在撥打服務時以某種方式命名它們..? – stiank81 2010-07-01 12:20:32

2

您需要WebInvoke屬性而不是WebGet

[OperationContract] 
[[WebInvoke(Method = "POST", UriTemplate = "/{id}")] 
Foo PutFooById(string id, Foo foo) 

注意,「POST」實際上是默認的方法,所以如果你的願望就可以省略。

+0

謝謝,我實際上得到了這部分。我的問題是如何傳遞發佈數據。對於這個功能 - 你如何傳遞foo?如何在客戶端添加後期數據,以及現在該服務如何將其解析爲「foo」參數? – stiank81 2010-07-01 06:56:51

+0

IIRC(已經有段時間了)你在'POST'中發佈一個序列化的'Foo'作爲你的消息體。如果您需要更詳細的確認,我會稍後再檢查一次。 – 2010-07-01 08:56:17

+0

好的 - 但是如果你想發佈多個參數呢?例如。一個foo和兩個字符串。它如何映射它們?我假設你需要以某種方式命名它們? – stiank81 2010-07-01 10:13:22