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;
)一样在前面加上"="号吗?
提前非常感谢!
内容类型
x-www-form-urlencoded
是一种键值格式。使用表单正文,您只能从请求正文中读取单个简单类型。由于名称是预期的,但在这种情况下不允许,您必须在等号前面加上前缀,以指示没有具有跟随值的名称。
但是,您应该避免接受 web-api 控制器操作正文中的简单类型。
如果您尝试在 HttpPost/HttpPut 的正文中传递数据而不直接实现您自己的 MediaTypeFormatter,则仅限于单个简单类型,这不太可能是可靠的。创建轻量级复杂类型通常更可取,并且将使与其他内容类型(如application/json
)的互操作变得更加容易。