WebApi传参总动员(三)
上篇介绍了如何从输入流中获取实体对象。本篇介绍以url形式传递参数。简单的参数不再赘述,这里主要实现形如(string name,Woman woman)这样的参数传递。
本篇及后面几章均涉及js调用及C#调用,而且篇幅较长,请大家见谅。
一、js调用。
WebApi:
public class ValuesController : ApiController
{ [HttpPost]
public string GetData(string name,Woman woman)
{
return "我是" + name + ",我喜欢" + woman.Name;
}
[HttpPost]
public string GetData(Woman woman)
{
return woman.Age + "的" + woman.Name;
} }
public class Woman//仅仅为了演示方便
{
public string Name{get;set;}
public string Age{get;set;}
}
JS端。JS端的obj2url(对象生成键值对)实现方法比较丑陋,如果有更好的方法请大家不吝赐教。
var woman = { Name: '刘亦菲', Age: 18 };
function obj2url(obj) {
var result='';
for (var i in obj) {
result += i + "=" + obj[i]+ "&";
}
return result.substr(0, result.length - 1);//返回 Name=刘亦菲&Age=18
}
$(function () { $('#btn').click(function () {
$.ajax({
type: "post",
url: "http://localhost:7601/api/values/GetData?name=楼主",
data: obj2url(woman),
success: function (r) {
alert(r);
}
});
});
});
如果是执行表单提交,则可以直接利用jq的 $('#formID').serialize()直接获取键值对。
看请求数据:
执行结果:
这里有两点注意:
1、浏览器发起的请求,url中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,也就是会自动urlencode。
2、请求中的Form Data,未经编码,也能正确的传递到Api中。(如:Name:刘亦 菲?/)
这是经过试验得出来的,理论依据没找。结论是否正确?忘有那位朋友不吝赐教。
二、C#调用。这里主要涉及
服务端WebApi代码不变。给Woman类添加一个属性,public List<DateTime> ExerciseTime { get; set; },来增大难度。
客户端:
首先来个基础调用类:此类是用HttpWebRequest发起请求,是同步的,后期我们会升级到HttpClient,异步。
//PostService.cs
public class PostService
{
public bool PostWebRequest(string postUrl, string postvalue, out string returnValue)
{
returnValue = string.Empty;
try
{
byte[] byteData = Encoding.UTF8.GetBytes(postvalue);
Uri uri = new Uri(postUrl);
HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(uri);
webReq.Method = "POST";
webReq.ContentType = "application/x-www-form-urlencoded";
webReq.ContentLength = byteData.Length;
//定义Stream信息
Stream stream = webReq.GetRequestStream();
stream.Write(byteData, , byteData.Length);
stream.Close();
//获取返回信息
HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
StreamReader streamReader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
returnValue = streamReader.ReadToEnd();
//关闭信息
streamReader.Close();
response.Close();
stream.Close();
return true;
}
catch (Exception ex)
{
returnValue = ex.Message;
return false;
}
} }
具体调用代码:
private void btnPost_Click(object sender, EventArgs e)
{
NameValueCollection queryString = System.Web.HttpUtility.ParseQueryString(string.Empty);
queryString["Name"] = "刘亦菲";
queryString["Age"] = "";
queryString["ExerciseTime[0]"] = DateTime.Now.ToString();
queryString["ExerciseTime[1]"] = DateTime.Now.AddHours(-).ToString();
queryString["ExerciseTime[2]"] = "哈哈";
string postdata = queryString.ToString(); // Returns "key1=value1&key2=value2", all URL-encoded
//string postdata = "Name=刘亦菲&Age=18";//string postdata = "Name=刘亦 菲?/&Age=18";也OK。
string url = "http://localhost:7601/api/values/GetData?name=楼主";
string retValue = "";
PostService service = new PostService();
service.PostWebRequest(url, postdata, out retValue);
MessageBox.Show(retValue);
}
调用结果:
传入的Name为编码后的值,需要解码才能获得正确的值。有点奇怪。
好吧,再做一次试验:
调用代码修改一下,不编码直接拼字符串:
string postdata = "Name=刘亦菲&Age=18";//string postdata = "Name=刘亦 菲?/&Age=18";也OK。
string url = "http://localhost:7601/api/values/GetData?name=楼主";
string retValue = "";
PostService service = new PostService();
service.PostWebRequest(url, postdata, out retValue);
结论:由客户端发起的请求数据,需要编码、解码配对使用。
基础差啊,就表现出来了。原理、原理、原理,说三遍。忘知道的员友不吝赐教。
注意1、List<T>的传参方式。2、类的属性为实体类的情况,比如:
public class Woman//仅仅为了演示方便
{
public string Name{get;set;}
public string Age{get;set;}
public List<DateTime> ExerciseTime { get; set; }
public Son Son { get; set; }
}
public class Son
{
public string Name{get;set;}
public int Age{get;set;}
}
那么猜想的传递方法为:
queryString["Son.Name"] = "儿子";
queryString["Son.Age"] = "";
再复杂一点,有几个儿子:
public List<Son> Son { get; set; }
那么猜想的传递方法为:
queryString["Son[0].Name"] = "儿子";
queryString["Son[0].Age"] = "";
请员友自行验证。
WebApi传参总动员(三)的更多相关文章
- WebApi传参总动员(四)
前文介绍了Form Data 形式传参,本文介绍json传参. WebApi及Model: public class ValuesController : ApiController { [HttpP ...
- WebApi传参总动员(一)
目前自己的工作和WebApi相关,免不了传入.接收参数.以前的老办法是从请求流中获取json,再反序列化,这中间有2个不能控制的地方,一个是流,一个是反序列化,都需要try,总感觉非常的不爽.因此对W ...
- WebApi传参总动员(五)
上回说到涉及多个实体的传参,用常规的方法已经不能解决了.这回我们用终极大招搞定她. WebApi:注意要引用JSON.Net [HttpPost] public string GetData(stri ...
- WebApi传参总动员(填坑)
本以为系列文章已经Over,突然记起来前面留了个大坑还没填,真是自己给自己挖坑. 这个坑就是: (body 只能被读取一次)Only one thing can read the body MVC和W ...
- WebApi传参总动员(二)
上篇,从最简单的string入手.本篇演示了从请求的输入流中获取实体.api: public class ValuesController : ApiController { [HttpPost] p ...
- C# WebApi传参之Post请求-AJAX
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷. 学无止境,精益求精 上一节讲述了C# WebApi传参之Get请求 ...
- react-绑定this并传参的三种方式
绑定this并传参的三种方式 在事件中绑定this并传参: <input type="button" value="在事件中绑定this并传参" onCl ...
- C# WebApi传参之Get请求-AJAX
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷. 学无止境,精益求精 在介绍本篇博客之前,先来温故下AJax的请求, ...
- vue路由传参的三种方式区别(params,query)
最近在做一个项目涉及到列表到详情页的参数的传递,网上搜索一下路由传参,结合自己的写法找到一种适合自己的,不过也对三种写法都有了了解,在此记录一下 <ul class="table_in ...
随机推荐
- 使用Fragment应用放置后台很久,被系统回收,出现crash
使用Fragment应用放置后台很久,被系统回收,出现crash:原因:系统做了源码FragmentActivity调用onSaveInstanceState保存Fragment对象,这时候系统恢复保 ...
- select into的不同数据库实现
DB2中修改表的schema除了通常的创建别名,还可以删除表重建 删除表的顺序应该是先在另一个Schema下新建表,然后使用select ino将原表的数据导入新表,再删除原表. 实现如下: 在Sch ...
- 桌面oracle 11g导入多年库的dump备忘
接到客户6G的dump文件.先导入桌面orcale ,imp提示出错,执行impdp后如下 连接到: Oracle Database 11g Express Edition Release 11.2. ...
- python 二进制读写文件
#-*- coding: utf-8 -*- f = open('f:/text.bmp','rb') filedata = f.read() filesize = f.tell() f.close( ...
- STM32 SPI DMA 的使用
一是想总结一下SPI总线的特点与注意点,二是总结一下SPI DMA的使用 一.SPI信号线说明 通常SPI通过4个引脚与外部器件相连: MISO:主设备输入/从设备输出引脚.该引脚在从模式下发送数据, ...
- Selenium自动化测试项目案例实践公开课
Selenium自动化测试项目案例实践公开课: http://gdtesting.cn/news.php?id=55
- [PaPaPa][需求说明书][V0.3]
PaPaPa软件需求说明书V0.3 前 言 不好意思,本文是没有前言的. 别说是前言了,其实关于界面的内容我也是不打算写!! 因为我知道你们想要的界面是这样的: 再不济也应该是这样的: 但是我 ...
- 跟随标准与Webkit源码探究DOM -- 获取元素之getElementsByTagName
按照标签名获取元素 -- getElementsByTagName 标准 DOM 1在Element和Document两个interface中均有定义,原型NodeList getElementsBy ...
- 突破GFW,使用node.js
原文链接:https://cnodejs.org/topic/4f9904f9407edba21468f31e 这个也是网上搜的,亲自试过,非常好用! 镜像使用方法(三种办法任意一种都能解决问题,建议 ...
- 【转载】linux内核启动android文件系统过程分析
主要介绍linux 内核启动过程以及挂载android 根文件系统的过程,以及介绍android 源代码中文件系统部分的浅析. 主要源代码目录介绍Makefile (全局的Makefile)bioni ...