我最初询问了一个关于我正在尝试编写的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;
)中签名?
非常感谢提前!
答案 0 :(得分:1)
内容类型x-www-form-urlencoded
是键值格式。使用表单主体,您只能从请求主体中读取单个简单类型。由于名称是预期的,但在这种情况下不允许,您必须在等号前面加上前缀,表示没有带有后续值的名称。
但是,您应该不再接受web-api控制器操作体内的简单类型。
如果您尝试在HttpPost / HttpPut的主体中传递数据而不直接实现自己的MediaTypeFormatter,那么您只能使用一个简单类型,这不太可靠。创建轻量级复杂类型通常更为可取,并且可以更轻松地与其他内容类型(如application/json
)进行互操作。