[英]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.