WebApi学习 参数接收
把实际碰到的参数接收问题写下,以后好复习。
一.Get参数
使用Get参数一般我们会在方法中限定[HttpGet]
[FromUri]可以接收单个参数或实体类 Get模式下使用 方法中可以存在多个[FromUri]参数
基本参数
一般我们使用简单的参数时WebApi方法中可以使用如GetName(string sysid)的形式来接收参数也可以直接使用GetName([FromUri]string sysid)来接收参数
例:
//api
[HttpGet]
public IHttpActionResult GetButtons([FromUri]string sysid,[FromUri]string userid,[FromUri]string spid)
{
var q = _SysAuthAppService.GetButtons(sysid, spid, userid);
return Json(q);
}
实体参数
当我们要使用实体作为参数时如果使用GetName(SysModel model)的形式来接收是接收不到的,那我们可以使用
GetName([FromUri] SysModel model)的形式来接收实体参数
当然也可以采用先将实体序列化Json字符串然后传到后台后进行反序列化成实体来进行操作这也是一种不错的方法。
C#调用api的工具类代码 Get方式
///
/// 指定url地址使用Get 方式获取全部字符串 会自动带上token
///
/// 请求后台地址
/// 参数
///
public static string GetByToken(string url, Dictionary dic)
{
string result = "";
#region 添加Get 参数
StringBuilder builder = new StringBuilder();
int i = 0;
dic.Add("sysid", Common.sysid);
//dic.Add("token", Common.token);
if (dic != null)
{
foreach (var item in dic)
{
if (i > 0)
builder.Append("&");
builder.AppendFormat("{0}={1}", item.Key, item.Value);
i++;
}
}
#endregion
url = url + "?" + builder.ToString();
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Headers.Add("sysid", Common.sysid);
req.Headers.Add("token", Common.token);
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
Stream stream = resp.GetResponseStream();
//获取响应内容
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
result = reader.ReadToEnd();
}
return result;
}
二.Post参数
A.
[FromBody] 可以接收单个参数或实体类 ,方法中只能存在一个[FromBody] 参数
基本参数
跟Get参数一样get参数存在于url中那post参数存在于body中,因此可以使用[FromBody]如 UpName([FromBody] string name),但是如果多个参数要传入使用UpName([FromBody] string name,[FromBody] string age)就不行了,这种方法只能使用一个参数。
传入时键值需要为""才能接收到值
例
public int ApiLogin(LoginModel model)
{
Dictionary dic = new Dictionary();
dic.Add("", model.account);//此处比较特殊
dic.Add("password", model.password);
var result = MyUrlOp.PostByToken(Common.url + "/Authority/Test", dic);
return int.Parse(result);
}
//测试post方式frombody参数接收
[HttpPost]
public HttpResponseMessage Test([FromBody] string name)
{
HttpResponseMessage responseMessage = new HttpResponseMessage { Content = new StringContent("", Encoding.GetEncoding("UTF-8"), "text/plain") };
return responseMessage;
}
上述代码如果调用时在特殊处将dic.Add("", model.account)改为dic.Add("account", model.account)则下面的api就接收不到name的值了,而[FromBody] string name中的参数名name其实名称可以随便定义
我们可以传入实体类UpName([FromBody] NameModel) 其中NameModel是个实体类有name和age属性
以键值形式传入对应的key,value来获取
例
//api 测试post方式frombody参数接收
[HttpPost]
public HttpResponseMessage Test([FromBody] LoginModel model)
{
HttpResponseMessage responseMessage = new HttpResponseMessage { Content = new StringContent(model.account, Encoding.GetEncoding("UTF-8"), "text/plain") };
return responseMessage;
}
//c# 调用方法
//值传入也以键值得形式传入
//api接收处可以以实体类形式接收
public int ApiLogin(LoginModel model)
{
Dictionary dic = new Dictionary();
dic.Add("account", model.account);
dic.Add("password", model.password);
var result = MyUrlOp.PostByToken(Common.url + "/Authority/Test", dic);
return int.Parse(result);
}
B.
通过request方法获取参数 要点是需要获取传统的context方法如下
HttpContextBase context = (HttpContextBase)Request.Properties["MS_HttpContext"];//获取传统的context
HttpRequestBase request = context.Request;
var a = request["account"].ToString()
c#调用api的工具类代码 post方式
public static string PostByToken(string url, Dictionary dic)
{
string result = "";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "Post";
req.ContentType = "application/x-www-form-urlencoded";
req.Headers.Add("sysid", Common.sysid);
req.Headers.Add("token", Common.token);
#region 添加Post 参数
StringBuilder builder = new StringBuilder();
int i = 0;
dic.Add("sysid", Common.sysid);
//dic.Add("token", Common.token);
foreach (var item in dic)
{
if (i > 0)
builder.Append("&");
builder.AppendFormat("{0}={1}", item.Key, item.Value);
i++;
}
byte[] data = Encoding.UTF8.GetBytes(builder.ToString());
req.ContentLength = data.Length;
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(data, 0, data.Length);
reqStream.Close();
}
#endregion
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
Stream stream = resp.GetResponseStream();
//获取响应内容
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
result = reader.ReadToEnd();
}
return result;
}
C.
传入实体参数 以json字符串形式传入
可以有两种接收方式
1.request数据流 通过使用request数据流取得参数值 json字符串 取得后需反序列化
byte[] bdate = new byte[context.Request.InputStream.Length];
context.Request.InputStream.Read(bdate, 0, bdate.Length);
var req = System.Text.Encoding.Default.GetString(bdate);
req = HttpContext.Current.Server.UrlDecode(req);
var sjsonstr = JsonConvert.DeserializeObject(req);
var a = sjsonstr.sysid;
2.dynamic参数 以json字符串形式传入可以使用Upname(dynamic model)来接收
将实体序列化成json字符串然后传入
例
public ContentResult Uppassword(pwdModel model)
{
string smsg;
if (ModelState.IsValid)
{
//int i = pwdBll.Uppassword(model.oldpwd, model.newpwd);
//使用webapi
Dictionary dic = new Dictionary();
dic.Add("account", userInfo.userid);
dic.Add("oldpwd", model.oldpwd);
dic.Add("newpwd", model.newpwd);
string s_i = MyUrlOp.PostJsonstring(Common.url + "/Authority/UpPwd", dic);
int i = int.Parse(s_i);
smsg = i == 1 ? "ok" : (i == -1 ? "原密码错误" : "密码修改失败");
}
else
{
smsg = this.GetErrMessage();
}
return Content(smsg);
}
//api 通过dynamic来获取json
[HttpPost]
public HttpResponseMessage UpPwd(dynamic obj)
{
int i = _PwdAppService.Uppassword(obj.account.Value, obj.oldpwd.Value, obj.newpwd.Value);
HttpResponseMessage responseMessage = new HttpResponseMessage { Content = new StringContent(i.ToString(), Encoding.GetEncoding("UTF-8"), "text/plain") };
return responseMessage;
}
c#调用api的工具类代码 需指定req.ContentType = "application/json";
public static string PostJsonstring(string url, Dictionary dic)
{
string result = "";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "Post";
req.ContentType = "application/json";
req.Headers.Add("sysid", Common.sysid);
req.Headers.Add("token", Common.token);
#region 添加Post 参数
var s_jsonstr = JsonConvert.SerializeObject(dic);
byte[] data = Encoding.UTF8.GetBytes(s_jsonstr);
req.ContentLength = data.Length;
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(data, 0, data.Length);
reqStream.Close();
}
#endregion
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
Stream stream = resp.GetResponseStream();
//获取响应内容
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
result = reader.ReadToEnd();
}
return result;
}
备注:我们在调用webapi时需要使用token来验证一般将验证信息放在header头部中
1.URL显得更加简洁;
2.Url后面参数或formbody一般传递业务参数,而token作业安全认证参数放在其中有些格格不入,也不便于业务处理;
参考学习教程
C#进阶系列——WebApi 接口参数不再困惑:传参详解