上篇介绍了如何从输入流中获取实体对象。本篇介绍以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传参总动员(三)的更多相关文章

  1. WebApi传参总动员(四)

    前文介绍了Form Data 形式传参,本文介绍json传参. WebApi及Model: public class ValuesController : ApiController { [HttpP ...

  2. WebApi传参总动员(一)

    目前自己的工作和WebApi相关,免不了传入.接收参数.以前的老办法是从请求流中获取json,再反序列化,这中间有2个不能控制的地方,一个是流,一个是反序列化,都需要try,总感觉非常的不爽.因此对W ...

  3. WebApi传参总动员(五)

    上回说到涉及多个实体的传参,用常规的方法已经不能解决了.这回我们用终极大招搞定她. WebApi:注意要引用JSON.Net [HttpPost] public string GetData(stri ...

  4. WebApi传参总动员(填坑)

    本以为系列文章已经Over,突然记起来前面留了个大坑还没填,真是自己给自己挖坑. 这个坑就是: (body 只能被读取一次)Only one thing can read the body MVC和W ...

  5. WebApi传参总动员(二)

    上篇,从最简单的string入手.本篇演示了从请求的输入流中获取实体.api: public class ValuesController : ApiController { [HttpPost] p ...

  6. C# WebApi传参之Post请求-AJAX

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷.  学无止境,精益求精    上一节讲述了C# WebApi传参之Get请求 ...

  7. react-绑定this并传参的三种方式

    绑定this并传参的三种方式 在事件中绑定this并传参: <input type="button" value="在事件中绑定this并传参" onCl ...

  8. C# WebApi传参之Get请求-AJAX

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷.  学无止境,精益求精    在介绍本篇博客之前,先来温故下AJax的请求, ...

  9. vue路由传参的三种方式区别(params,query)

    最近在做一个项目涉及到列表到详情页的参数的传递,网上搜索一下路由传参,结合自己的写法找到一种适合自己的,不过也对三种写法都有了了解,在此记录一下 <ul class="table_in ...

随机推荐

  1. WPF笔记一

    笔记内容: BUG.WPF运行窗体时调用Hide()方法,然后再Show()异常的解决方案 WPF 窗体设置为无边框 选择本地文件 选择文件夹 WPF实现右下角弹出消息窗口 WPF 显示 HTTP 网 ...

  2. End of HTML blink tag

    Recently I have read a news which said "Firfox 23 nixes support for outdated blink HTML tag&quo ...

  3. C++读取mysql中utf8mb4编码表数据乱码问题及UTF8转GBK编码

    数据库编码为utf8,但是由于某些表的一些字段存储了emoji字符,表采用了utf8mb4编码,默认情况下在C++代码中读出的中文字段值都变成了乱码. 解决方法为,在进行数据库查询前,在C++中执行一 ...

  4. 生活科技两相宜:(一)Win7使用微软SkyDrive网盘简易教程

    今天得写一个Win7使用微软SkyDrive网盘的简易教程,主要是给我老婆看,顺便贴出来给大家共享一下:)    使用微软SkyDrive网盘有两个层次.一个是使用网页版,这个跟使用163或者QQ网盘 ...

  5. Linux连续执行多条命令

    引自:这里 每条命令使用";"隔开,则无论前边的命令执行成功与否都会继续执行下一条命令这里,故意将第二条命令中的echo多写了一个o,命令执行出错,但并不影响后续命令的执行可以这么 ...

  6. GitHub上排名前100的iOS开源库介绍(来自github)

    主要对当前 GitHub 排名前 100 的项目做一个简单的简介,方便初学者快速了解到当前 Objective-C 在 GitHub 的情况. 若有任何疑问可通过微博@李锦发联系我 项目名称 项目信息 ...

  7. Carthage 安装和使用

    和Cocoapods相比各有利弊吧,具体对比参见: Carthage 初探:四大优势与四大劣势 第一步:如果没有安装Homebrew先安装 打开命令终端,直接输入以下命令回车 /usr/bin/rub ...

  8. 自己封装的android客户端http网络框架

    整个框架是基于阿帕奇的httpclient搭建的,框架类图如下,我是用Astah Professional画出来,将项目导入,自动生成所有类关系图,还是挺方便的: 核心类是HttpManager和Ht ...

  9. keil l251 command summary --Lib

    keil l251 command summaryLIB251 LIST MYLIB.LIB TO MYLIB.LST PUBLICS LIB251 EXTRACT MYLIB.LIB (GOODCO ...

  10. Embedding Python in C

    http://codextechnicanum.blogspot.com/2013/12/embedding-python-in-c-converting-c.html //Make some vec ...