上篇介绍了如何从输入流中获取实体对象。本篇介绍以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. .net微信公众号开发——快速入门

    作者:王先荣 最近在学习微信公众号开发,将学习的成果做成了一个类库,方便重复使用. 现在微信公众号多如牛毛,开发微信的高手可以直接无视这个系列的文章了. 使用该类库的流程及寥寥数行代码得到的结果如下. ...

  2. 《objective-c基础教程》学习笔记(七)—— 存取方法

    在上一篇博文中,我们有拿一个简单的“汽车模型”来讲解复合关系.在今天的这篇博文中,我们将接着上一次的例子,讲解下存取(accessor)方法的使用.所谓存取方法,就是用来读取或改变某个对象属性的方法. ...

  3. drupal module 自定义

    01 <?php function mytracer_menu() { $items = array(); $items['admin/config/mytracer'] = array( 't ...

  4. [原创]实现android知乎、一览等的开场动画图片放大效果

    代码下载地址: https://github.com/Carbs0126/AutoZoomInImageView 知乎等app的开场动画为:一张图片被显示到屏幕的正中央,并充满整个屏幕,过一小段时间后 ...

  5. [原创]自定义BaseAcitivity的实现,统一activity的UI风格样式

        在开发过程中经常遇到多个activity是同一种样式类型的情况,如果分别对其进行UI的布局,不但比较繁琐,而且后续维护过程人力成本很高,不利于敏捷开发.解决的方案是采用抽象后的BaseActi ...

  6. 安装mmseg出错 config.status: error: cannot find input file: src/Makefile.in

    aclocallibtoolize --forceautomake --add-missingautoconfautoheadermake clean

  7. 构建基于WinRT的WP8.1 App 03:Page控件

    单页面模板 通常利用Visual Studio 2013创建的最简单的WP8.1应用是Blank App,它只包含一个不带任何UI的页面,并且没有任何状态管理的逻辑. 该不带任何UI的页面称为Blan ...

  8. shell 复习

    grep -v zip$  -v 逻辑否  $以zip结尾 (^开头) -n str不空,-z str 空

  9. JIRA数据库切换(HSQL Database到MySQL)

    没试过的版本,但是看着靠谱: 注:如果你之前配置过hsql版本,这次修改mysql数据操作会导致配置数据丢失,所以请注意备份 一. 创建名为jiradb的mysql数据,编码格式为utf-8 二.修改 ...

  10. Nutch插件系统

    Nutch 基本情况 Nutch 是 Apache 基金会的一个开源项目,它原本是开源文件索引框架 Lucene 项目的一个子项目,后来渐渐发展成长为一个独立的开源项目.它基于 Java 开发,基于 ...