假设我使用C#和.NET有以下Web方法:
[WebInvoke(UriTemplage="/users", Method="POST")]
[OperationContract]
public User AddNewUser(User u);
当您实现POST Web方法时,您将接受请求正文作为传入HTTP请求消息的一部分。期望从传入的HTTP消息体中反序列化参数u。
我的问题是:我们如何在客户端设置此请求主体?它必须设置在某个地方。这真让我困惑。
此外,如果我将“ResponseFormat = WebMessageFormat.Json”添加到WebInvoke,如何将返回的json字符串反序列化为User对象?
感谢。
答案 0 :(得分:1)
您的问题没有透露您尝试过的内容。如果您在客户端上使用.net,则可以使用DataContractSerializer来获取序列化数据。
然后,您可以使用 HttpWebRequest ,方法设置为 POST 。 将序列化数据添加到Web请求并使用GetResponse()方法。
或者,您可以使用Fiddlr使用您创建的请求来测试您的Web服务。它简明扼要地显示了服务器的确切内容。
答案 1 :(得分:0)
对WCF Rest方法执行POST请求:
private string UseHttpWebApproach<T>(string serviceUrl, string resourceUrl, string method, T requestBody)
{
string responseMessage = null;
var request = WebRequest.Create(string.Concat(serviceUrl, resourceUrl)) as HttpWebRequest;
if (request != null)
{
request.ContentType = "application/json";
request.Method = method;
}
if(method == "POST" && requestBody != null)
{
byte[] requestBodyBytes = ToByteArrayUsingJsonContractSer(requestBody);
request.ContentLength = requestBodyBytes.Length;
using (Stream postStream = request.GetRequestStream())
postStream.Write(requestBodyBytes, 0, requestBodyBytes.Length);
}
if (request != null)
{
var response = request.GetResponse() as HttpWebResponse;
if(response.StatusCode == HttpStatusCode.OK)
{
Stream responseStream = response.GetResponseStream();
if (responseStream != null)
{
var reader = new StreamReader(responseStream);
responseMessage = reader.ReadToEnd();
}
}
else
{
responseMessage = response.StatusDescription;
}
}
return responseMessage;
}
private static byte[] ToByteArrayUsingJsonContractSer<T> (T requestBody)
{
byte[] bytes = null;
var serializer1 = new DataContractJsonSerializer(typeof(T));
var ms1 = new MemoryStream();
serializer1.WriteObject(ms1, requestBody);
ms1.Position = 0;
var reader = new StreamReader(ms1);
bytes = ms1.ToArray();
return bytes;
}
现在假设您的User对象如下所示:
Public Class User
{
Public int UserId {get;set;}
Public string UserName {get;set;}
Public string Password {get;set;}
}
要调用上面的方法:
User objUser = new objUser();
objUser.Username = "Test";
objUser.Password = "Test";
UseHttpWebApproach<User>(serviceBaseUrl, "users", "POST", objUser);