2014-02-20 42 views
2

如何獲取Web服務方法以訪問URI和複雜的POST數據中的參數?使用URI和Da​​taContract類參數編寫webservice方法

我有在URI參數的一些Web服務方法:

"/api/{something}/{id}" 

我也有標有DataContract類/成員屬性我想要的web服務的方法來接受。請注意,我的類包含一個也標有DataContract/Member屬性的子類。

[DataContract] 
public class MoreData{ 
    [DataMember] 
    public string SomeString { get; set; } 

    [DataMember] 
    public SubClass SubData {get; set;} 
} 

我的方法聲明如下:

[OperationContract] 
[WebInvoke(Method = "POST", UriTemplate = "/api/{something}/{id}")] 
public MyWebSvcRetObj Update(string something, string id) 

我將如何得到我的更新方法也接受MOREDATA類?我已經能夠寫出這樣的方法:

[OperationContract] 
[WebInvoke(Method = "POST")] 
public MyWebSvcRetObj Update(MoreData IncomingData) 

但只有當URI沒有指定任何參數,而URI看起來像

"api/Update" 

最後,我希望我的用戶能夠是這樣的:

$.ajax({ 
    url: 'localhost/site/api/things/12345 
    type: 'POST' 
    data: { 
     SomeString: 'I am a string' 
     SubData: { 
      //...more data 
     } 
    } 
}); 

我試圖把一個流作爲更新方法的最後一個參數,但似乎並沒有爲有像我給的例子子類的工作。它最終有鍵/值對,如「SubData [SomeSubDataProp]」:「Val」。這對我來說似乎是錯誤的。我也嘗試在Update方法中添加一個MoreData參數作爲最終參數,但是我得到一個錯誤,表示它期待一個流(因爲它期望的是原始數據)。我正在嘗試做什麼?或者也許我正在以這種錯誤的方式進行呢?

UPDATE

由於Faizan Mubasher寫道,我的用戶將能夠發送POST數據如果我的方法是這樣的:

[OperationContract] 
    [WebInvoke(Method = "POST", 
     UriTemplate = "/v1/{something}/{id}", 
     RequestFormat = WebMessageFormat.Json, 
     BodyStyle = WebMessageBodyStyle.Bare 
    )] 
    [Description("Update ")] 
    public void Update(MoreData Incoming, string something, string id) 

隨着客戶尋找這樣的:

$.ajax({ 
    type: 'POST', 
    url: 'http://localhost/app/api/something/12345', 
    contentType: 'application/json',     //need to specify type 
    data: JSON.stringify({       //note the "stringify" call 
     SomeString: 'hello, world', 
     SubClass: { 
      SubStr: 'hello, again', 
      SubInt: 98765 
     } 
    } 
}); 
+0

我不這麼認爲這是使用POST方法的正確方法。爲什麼您在使用JSON發送數據時在URI中指定{something}/{id}?不明白這件事。 –

+0

我希望我的用戶使用「api/things/123」來獲取某些數據,修改它,並使用相同的URI和GET中的數據對該實體進行更改來執行POST。我的問題是我的「事物」和「身份證」都是動態的。我該如何做到這一點,以便我的用戶可以指定URI中的資源類型和ID發送JSON數據? – spots

+0

所以你想爲同一個URI的GET和POST? –

回答

5

你要保持同樣的URI兩個,GETPOST

  1. GET方法被調用,參數/API/{事}/{ID},然後根據ID,將數據返回到客戶端,他/她可以編輯。

  2. 當編輯完成時,使用POST方法用相同URIID作爲在提到GET請求發送編輯的數據回服務器。

如果是這樣,那麼這裏是解決方案:

要做到這一點,創建兩個方法有相同UriTemplate但不同的名稱。

[ServiceContract] 
public interface IMyWebSvc 
{ 

    [OperationContract] 
    [WebGet(UriTemplate = "/api/{something}/{id}", 
     ResponseFormat = WebMessageFormat.Json, 
     BodyStyle = WebMessageBodyStyle.Bare)] 
    MyWebSvcRetObj GetData(string something, string id); 

    [OperationContract] 
    [WebInvoke(Method = "POST", UriTemplate = "/api/{something}/{id}", 
     RequestFormat = WebMessageFormat.Json,  
     BodyStyle = WebMessageBodyStyle.Bare)] 
    string Update(MoreData IncomingData, string something, string id);  
} 

現在,應該是什麼格式的JSON。這很容易。在你的MoreData類中,覆蓋ToString()方法。

public override string ToString() 
{ 
    JavaScriptSerializer js = new JavaScriptSerializer(); 
    return js.Serialize(this); 
} 

JavaScriptSerializerSystem.Web.Script.Serialization可用。現在,要檢查您的服務將接受哪種JSON格式,請對您的Web服務方法進行虛擬調用,並在object.ToString()方法中創建一箇中斷點。

MoreData md = new MoreData(); 
string jsonString = md.ToString(); // hit break point here. 

當你點擊破發點,在jsonString變量,你將有JSON是您的服務將接受。因此,建議您的客戶端以該格式發送JSON。

因此,您可以在您的MoreData類中指定複雜類型。

我希望這會幫助你!謝謝

+0

這正是我正在尋找的。非常感謝你! – spots

0

它看起來像您將JSON數據發佈到您的強類型web服務方法。

這有點切到這個話題:How to pass strong-typed model as data param to jquery ajax post?

一種解決方案是接受Json對象(你所提到的鍵值對)和反序列化到您的MoreData類型。

+0

是的,我將JSON數據發佈到我的web服務方法。問題是,我無法接受一個數據約定類,它表示客戶端以POST數據發送的結構並具有URI參數。如果我的URI模板看起來像「/ api/{something}/{id}」,並且我的方法聲明看起來像public MyWebSvcRetObj Update(MoreData IncomingData)接受一個JSON對象,我會得到錯誤。 – spots

+0

您能否指定您使用每種方法的裝飾器? – mrtig

+0

我添加了我用於允許使用我的「MoreData」類作爲參數的方法的裝飾器。該方法的其他版本的裝飾器已在帖子中。第二個版本的問題在於用戶需要提供「localhost/site/api/Update」。我的要求是,該URI將指定哪個資源正在更新。 – spots

相關問題