【问题标题】:How to set the request body on the client side如何在客户端设置请求正文
【发布时间】:2012-03-18 14:55:53
【问题描述】:

假设我有以下使用 C# 和 .NET 的 Web 方法:

[WebInvoke(UriTemplage="/users", Method="POST")]
[OperationContract]
public User AddNewUser(User u);

预计当您实现 POST Web 方法时,您将接受请求正文作为传入 HTTP 请求消息的一部分。参数 u 应该从传入的 HTTP 消息体中反序列化。

我的问题是:我们如何在客户端设置这个请求正文?它必须设置在某个地方。这真的让我很困惑。

如果我在 WebInvoke 中添加了“ResponseFormat = WebMessageFormat.Json”,如何将返回的 json 字符串反序列化为 User 对象?

谢谢。

【问题讨论】:

  • 如果这些答案对您有所帮助,那么请花时间奖励答案。

标签: c# wcf http rest


【解决方案1】:

您的问题并未透露您尝试过的内容。如果您在客户端上使用 .net,则可以使用 DataContractSerializer 获取序列化数据。

然后您可以使用 HttpWebRequest 并将方法设置为 POST。 将序列化数据添加到 Web 请求并使用 GetResponse() 方法。

或者,您可以使用Fiddlr 使用您创建的请求来测试您的网络服务。它可以让您简明扼要地了解服务器上正在发生的事情。

【讨论】:

    【解决方案2】:

    要对 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);
    

    【讨论】:

    • 您的 responseMessage 是一个字符串。如何从中获取用户对象?谢谢!
    • 您需要使用 DataContractSerializer 将字符串数据反序列化到您的对象实例中。
    • 如果请求正文中包含用户密码等敏感数据,如何保证安全?
    • 您可以在您的服务器上使用带有 ssl 的 Https。如果您真的想提高安全性,您还可以使用服务器发布的时间敏感哈希来加密密码,可能基于用户的 IP,但这超出了这个问题的范围。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 2015-07-23
    • 2013-12-02
    • 2016-02-27
    • 2019-04-13
    相关资源
    最近更新 更多