C# Web API REST Service POST

本文关键字:Service POST REST API Web | 更新日期: 2023-09-27 18:31:32

我最初问了一个关于我尝试编写的 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;)一样在前面加上"="号吗?

提前非常感谢!

C# Web API REST Service POST

内容类型

x-www-form-urlencoded是一种键值格式。使用表单正文,您只能从请求正文中读取单个简单类型。由于名称是预期的,但在这种情况下不允许,您必须在等号前面加上前缀,以指示没有具有跟随值的名称。

但是,您应该避免接受 web-api 控制器操作正文中的简单类型。

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