2012-12-17 121 views
7

我是RESTful服務的初學者。如何將JSON參數傳遞給/使用RESTful WCF服務?

我需要創建一個接口,客戶端需要傳遞多達9個參數。

我寧願將參數作爲JSON對象傳遞。

舉例來說,如果我的JSON是:

'{ 
    "age":100, 
    "name":"foo", 
    "messages":["msg 1","msg 2","msg 3"], 
    "favoriteColor" : "blue", 
    "petName" : "Godzilla", 
    "IQ" : "QuiteLow" 
}' 

如果我需要在最後下面執行服務器端方法:

public Person FindPerson(Peron lookUpPerson) 
{ 
Person found = null; 
// Implementation that finds the Person and sets 'found' 
return found; 
} 

問題(S):
如何我應該使用上面的JSON字符串從客戶端撥打電話嗎? 我怎樣才能創建簽名和實施

  • 接受這個JSON的RESTful服務的方法,
  • 解析,並將其反序列化到Person對象和
  • 調用/返回是FindPerson方法的返回值回客戶?
+0

見http://stackoverflow.com/questions/13165533/deserialize-json-object-sent-from-android-app-to-wcf-webservice –

+0

哪些是您使用來調用服務的語言? JavaScript,C#,別的東西? – carlosfigueira

回答

9

如果你想要創建一個WCF操作來接收該JSON輸入,則需要定義映射到該輸入的數據契約。有幾個工具可以自動完成這項工作,其中包括我在http://jsontodatacontract.azurewebsites.net/(有關如何在this blog post編寫此工具的更多詳細信息)中編寫的工具。該工具生成的這個類,你可以使用:

// Type created for JSON at <<root>> 
[System.Runtime.Serialization.DataContractAttribute()] 
public partial class Person 
{ 

    [System.Runtime.Serialization.DataMemberAttribute()] 
    public int age; 

    [System.Runtime.Serialization.DataMemberAttribute()] 
    public string name; 

    [System.Runtime.Serialization.DataMemberAttribute()] 
    public string[] messages; 

    [System.Runtime.Serialization.DataMemberAttribute()] 
    public string favoriteColor; 

    [System.Runtime.Serialization.DataMemberAttribute()] 
    public string petName; 

    [System.Runtime.Serialization.DataMemberAttribute()] 
    public string IQ; 
} 

接下來,你需要定義一個操作合同接收。由於JSON需要進入請求的主體,因此使用的最自然的HTTP方法是POST,因此您可以按如下方式定義操作:方法爲「POST」,樣式爲「Bare」(這意味着您的JSON直接映射到參數)。請注意,您甚至可以省略MethodBodyStyle屬性,因爲"POST"WebMessageBodyStyle.Bare分別是它們的默認值)。

[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Bare)] 
public Person FindPerson(Peron lookUpPerson) 
{ 
    Person found = null; 
    // Implementation that finds the Person and sets 'found' 
    return found; 
} 

現在,在您的輸入映射到lookupPerson的方法中。你將如何實現你的方法的邏輯取決於你。

更新(通過jQuery)評論後,調用使用JavaScript服務的

一個例子可以在下面找到。

var input = '{ 
    "age":100, 
    "name":"foo", 
    "messages":["msg 1","msg 2","msg 3"], 
    "favoriteColor" : "blue", 
    "petName" : "Godzilla", 
    "IQ" : "QuiteLow" 
}'; 
var endpointAddress = "http://your.server.com/app/service.svc"; 
var url = endpointAddress + "/FindPerson"; 
$.ajax({ 
    type: 'POST', 
    url: url, 
    contentType: 'application/json', 
    data: input, 
    success: function(result) { 
     alert(JSON.stringify(result)); 
    } 
}); 
+0

非常有用的答案carlosfigueira! (你也可以添加Javascript調用,以便它可以大致覆蓋所有部分)謝謝! – pencilCake

+0

我問過如何用JavaScript內置函數的用法來替換這個jquery ajax調用:)(見我的最後一個問題,如果感興趣:)) – pencilCake

+0

該示例在http://msdn.microsoft.com/en-us/library /vstudio/bb472488(v=vs.100).aspx顯示了使用XMLHttpRequest對象的一種方法。 – carlosfigueira

1

1 - 添加WebGet屬性

<OperationContract()> _ 
     <WebGet(UriTemplate:="YourFunc?inpt={inpt}", BodyStyle:=WebMessageBodyStyle.Wrapped, 
       RequestFormat:=WebMessageFormat.Json, ResponseFormat:=WebMessageFormat.Xml)> _ 
     Public Function YourFunch(inpt As String) As String 

2 - 使用NewtonSoft序列化/反序列化JSON轉換成你的對象(注意上述只是需要在字符串),NewtonSoft比MS串行快得多。

使用NewtonSoft系列化http://json.codeplex.com/

3-您的.svc文件將包含工廠=「System.ServiceModel.Activation.WebServiceHostFactory

4-你的web.config將包含

 <behaviors> 
     <endpointBehaviors> 
     <behavior name="webHttpBehavior"> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 

...和...

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 
+1

如果你想傳遞一個JSON輸入到WCF服務,你不應該使用'[WebGet]' - 輸入應該在請求體中傳遞,所以不應該使用GET。它應該使用'[WebInvoke]'代替。 – carlosfigueira

相關問題