我是RESTful服务的初学者。
我需要创建一个接口,客户端需要传递最多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字符串从客户端进行调用?
如何创建
答案 0 :(得分:12)
如果要创建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直接映射到参数)。请注意,您甚至可以省略Method
和BodyStyle
属性,因为"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
。如何实现方法的逻辑取决于你。
评论后更新
使用JavaScript(通过jQuery)调用服务的一个示例可以在下面找到。
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));
}
});
答案 1 :(得分: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序列化/反序列化为你的对象(注意上面只接受String),NewtonSoft比MS序列化器快得多。
使用NewtonSoft进行序列化http://json.codeplex.com/
3-你的.svc文件将包含Factory =“System.ServiceModel.Activation.WebServiceHostFactory
4-你的web.config将包含
<behaviors>
<endpointBehaviors>
<behavior name="webHttpBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
...和...
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>