我正在编写一个.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,所以我对它没有更多的了解。
答案 0 :(得分:0)
您的LoginResponse类看起来应该是这样的:
[DataContract]
public class LoginResponse
{
[DataMember]
public string token { get; set; }
}
需要使用DataContract和DataMember属性进行修饰,以便序列化程序(在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。