C#Web API REST服务POST

时间:2016-01-23 21:22:59

标签: c# json asp.net-web-api

我最初询问了一个关于我正在尝试编写的WCF Web服务的问题,然后发现ASP.net Web API更适合我的需求,因为这里有一些反馈。

我现在找到了一个很好的教程,告诉我如何使用Web API创建一个简单的REST服务,该服务非常适合开箱即用。

我的问题

我的REST服务服务器中有一个POST方法:

    // POST api/values/5
    public string Post([FromBody]string value)
    {
        return "Putting value: " + value;
    }

我可以使用POSTER和我的C#客户端代码对此进行POST。

然而,我不明白为什么我必须在前面添加一个' ='签署POST数据,使其显示为:" =这是我的数据,实际上是一个JSON字符串&#34 ;;而不只是发送:"这是我的数据实际上是一个JSON字符串&#34 ;;

与REST服务对话的My C#Client编写如下:

 public string SendPOSTRequest(string sFunction, string sData)
    {
        string sResponse = string.Empty;

        // Create the request string using the data provided
        Uri uriRequest = GetFormRequest(m_sWebServiceURL, sFunction, string.Empty);
        // Data to post
        string sPostData = "=" + sData;
        // The Http Request obj
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriRequest);
        request.Method = m_VERB_POST;
        System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
        Byte[] byteArray = encoding.GetBytes(sPostData);
        request.ContentLength = byteArray.Length;
        request.ContentType = m_APPLICATION_FORM_URLENCODED;                

        try
        {
            using (Stream dataStream = request.GetRequestStream())
            {
                dataStream.Write(byteArray, 0, byteArray.Length);
            }
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                using (Stream stream = response.GetResponseStream())
                {
                    StreamReader reader = new StreamReader(stream, Encoding.UTF8);
                    sResponse = reader.ReadToEnd();
                }                    
            }
        }
        catch (WebException ex)
        {
             //Log exception
        }

        return sResponse;
    }

    private static Uri GetFormRequest(string sURL, string sFunction, string sParam)
    {
        StringBuilder sbRequest = new StringBuilder();
        sbRequest.Append(sURL);

        if ((!sURL.EndsWith("/") &&
            (!string.IsNullOrEmpty(sFunction))))            
        {
            sbRequest.Append("/");
        }
        sbRequest.Append(sFunction);

        if ((!sFunction.EndsWith("/") && 
            (!string.IsNullOrEmpty(sParam))))
        {
            sbRequest.Append("/");
        }
        sbRequest.Append(sParam);

        return new Uri(sbRequest.ToString());
    }

有人能够解释为什么我必须在前面添加' ='如上面的代码(string sPostData = "=" + sData;)中签名?

非常感谢提前!

1 个答案:

答案 0 :(得分:1)

内容类型x-www-form-urlencoded是键值格式。使用表单主体,您只能从请求主体中读取单个简单类型。由于名称是预期的,但在这种情况下不允许,您必须在等号前面加上前缀,表示没有带有后续值的名称。

但是,您应该不再接受web-api控制器操作体内的简单类型。

如果您尝试在HttpPost / HttpPut的主体中传递数据而不直接实现自己的MediaTypeFormatter,那么您只能使用一个简单类型,这不太可靠。创建轻量级复杂类型通常更为可取,并且可以更轻松地与其他内容类型(如application/json)进行互操作。