使用WCF使用REST(JSON)API

时间:2010-11-24 22:35:35

标签: wcf json rest

我正在编写一个.NET应用程序,它将与基于JSON的API通信以提取/推送数据。我之前看过类似的问题: Consuming a RESTful JSON API using WCF

但是我需要关于同一主题的更多信息。这是JSON,我必须发送请求:
{ “登录”:{ “密码”: “密码”, “用户名”: “USERNAME”}}

和响应JSON将是这样的:
{ “响应”:{ “状态”: “OK”, “标记”: “o9b0jrng273hn0”}}

以下是我提出的建议:

[ServiceContract]
public interface ITestApi
{
    [OperationContract]
    [WebInvoke( Method = "POST",
        BodyStyle = WebMessageBodyStyle.Wrapped,
        RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json,
        UriTemplate = "/login"
        )]
    LoginResponse Login( LoginRequest login );
}

其中LoginRequest具有用户名和密码属性,而LoginResponse具有令牌属性。

当我调用api时,请求成功,我按预期得到了回复(我用Fiddler验证了这一点)。但是WCF无法为我创建LoginResponse对象。它总是为空。我相信我做的有些不对,有人可以指出我要做些什么才能做到这一点吗?

这是创建基于JSON的REST服务客户端的正确方法吗?我第一次使用RESTful api,所以我对它没有更多的了解。

2 个答案:

答案 0 :(得分:0)

您的LoginResponse类看起来应该是这样的:

[DataContract]
public class LoginResponse 
{ 
    [DataMember]
    public string token { get; set; } 
}

需要使用DataContractDataMember属性进行修饰,以便序列化程序(在JSON的情况下为DataContractJsonSerializer)知道如何序列化它。

编辑:

此外,您的客户端应配置为使用webHttpBinding,并且endpoint behavior应配置为使用webHttp,如下面的example所示。

答案 1 :(得分:0)

this项目中的lib文件夹或从WCF REST Starter Kit获取Microsoft.Http客户端库。使用此功能,您可以:

var client = new HttpClient();
var content = HttpContent.Create("{'login':{'password':'PASSWORD','username':'USERNAME'}}", "application/json");
var response = client.Post("http://service.com/login",content);
var jsonString = response.Content.ReadAsString();

如果您不想将Json作为字符串读取并使用类似Json.Net的内容进行解析,并且您更喜欢使用DataContracts,则可以执行以下操作:

var loginResponse = response.Content.ReadAsJsonDataContract<LoginResponse>();

在客户端上使用WCF通道来处理REST服务只会让您感到痛苦,而不是您真正想要的。你最好坚持使用普通的HTTP。