繁体   English   中英

C#Web API REST服务POST

[英]C# Web API REST Service POST

我最初问一个有关我尝试编写的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数据前添加一个'='符号,以便其读取:“ =这里是我的数据,实际上是一个JSON字符串”; 而不是仅仅发送:“这是我的数据,实际上是JSON字符串”;

与REST服务对话的C#客户端编写如下:

 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; )吗?

提前谢谢了!

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

但是,您应该避免在Web-api控制器操作的主体内接受简单类型。

如果您尝试在HttpPost / HttpPut的正文中传递数据而没有直接实现自己的MediaTypeFormatter,则只能使用一个简单类型,这不太可能可靠。 创建轻型复杂类型通常更可取,并且将使与其他内容类型(例如application/json互操作变得更加容易。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM