并且我们知道了Post,Put方法只能有一个FromBody参数,再有多个参数时,上讲提到,需要将它封装成一个对象进行传递,而这讲主要围绕这个话题来说,接口层添加一个新类User_Info,用来进行数据传递,而客户端使用网页ajax和控制台HttpClient的方式分别进行实现,Follow me!

下面定义一个复杂类型对象

   public class User_Info
{
public int Id { get; set; }
public string Name { get; set; }
public string Info { get; set; }
}

下面修改上次的api部分,让它对这个对象进行操作

    [CorsAttribute("http://localhost:3321")]
public class RegisterController : ApiController
{
public static List<User_Info> Model = new List<User_Info>()
{
new User_Info{Id=1,Name="zzl",Info="zzl是楼主"},
new User_Info{Id=2,Name="zhz",Info="zhz是zzl的儿子"},
new User_Info{Id=3,Name="zql",Info="zql是zzl的妻子"},
new User_Info{Id=4,Name="bobo",Info="bobo是zzl的朋友"}
}; // GET api/values
public IEnumerable<User_Info> Get()
{
return Model;
}
// GET api/values/5
public User_Info Get(int id)
{
var entity = Model.FirstOrDefault(i => i.Id == id);
return entity;
}
// GET api/values/5?leval=1
public HttpResponseMessage Get(int id, int leval)
{
return new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent("<em style='color:red'>成功响应(id,level)</em>", System.Text.Encoding.UTF8, "text/html")
};
}
// POST api/values
public HttpResponseMessage Post([FromBody]User_Info value)
{
Model.Add(new User_Info
{
Id = value.Id,
Info = value.Info,
Name = value.Name,
});
//用户登陆相关
return new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent("添加数据成功,用户ID:" + value.Id, System.Text.Encoding.UTF8, "text/plain")
};
}
// PUT api/values?userid=5
public HttpResponseMessage Put(int userid, [FromBody]User_Info value)
{
var entity = Model.FirstOrDefault(i => i.Id == userid);
entity.Info = value.Info;
entity.Name = value.Name;
return new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent("修改数据成功,主键:" + userid + ",对象:" + value.Name)
};
} // DELETE api/values/5
public HttpResponseMessage Delete(int id)
{
Model.Remove(Model.FirstOrDefault(i => i.Id == id));
return new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent("删除数据成功")
};
}

而最关键的地方还是在各个客户端调用的时候,首先,你不能指望客户端去引用你的程序集,因为,不能平台无法实现这种引用(java & c#,js & C#,php & c#),所以,在调用时需要有它们各自的方法,而JS的ajax调用时,直接使用json对象即可,键名对象

实体的属性,在使用HttpClient时,直接为FormUrlEncodedContent对象赋一个键值对的集合即可,下面分别介绍一下

HTML的JS实现

     $.ajax({
url: "http://localhost:52824/api/register",
type: "POST",
data: { Id: 5, Name: '新来的', Info: '大家好' },//这里键名称必须为空,多个参数请传对象,api端参数名必须为value
success: function (data) {
console.log("post:" + data);
}
}); $.ajax({
url: "http://localhost:52824/api/register",
type: "GET",
success: function (data) {
for (var i in data) {
console.log(data[i].Id + " " + data[i].Name);
}
}
});

结果截图

aaarticlea/png;base64,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" alt="" />

Console程序中使用HttpClient对象进行实现

       /// <summary>
  /// HttpClient实现Post请求
/// </summary>
static async void dooPost()
{
string url = "http://localhost:52824/api/register";
//设置HttpClientHandler的AutomaticDecompression
var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
//创建HttpClient(注意传入HttpClientHandler)
using (var http = new HttpClient(handler))
{
//使用FormUrlEncodedContent做HttpContent
var content = new FormUrlEncodedContent(new Dictionary<string, string>()
{ {"Id","6"},
{"Name","添加zzl"},
{"Info", "添加动作"}//键名必须为空
}); //await异步等待回应 var response = await http.PostAsync(url, content);
//确保HTTP成功状态值
response.EnsureSuccessStatusCode();
//await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,因为上面的AutomaticDecompression = DecompressionMethods.GZip)
Console.WriteLine(await response.Content.ReadAsStringAsync());
} }
/// <summary>
/// HttpClient实现Get请求
/// </summary>
static async void dooGet()
{
string url = "http://localhost:52824/api/register?id=1";
//创建HttpClient(注意传入HttpClientHandler)
var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip }; using (var http = new HttpClient(handler))
{
//await异步等待回应
var response = await http.GetAsync(url);
//确保HTTP成功状态值
response.EnsureSuccessStatusCode(); //await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,因为上面的AutomaticDecompression = DecompressionMethods.GZip)
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}
/// <summary>
/// HttpClient实现Put请求
/// </summary>
static async void dooPut()
{
var userId = 1;
string url = "http://localhost:52824/api/register?userid=" + userId; //设置HttpClientHandler的AutomaticDecompression
var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
//创建HttpClient(注意传入HttpClientHandler)
using (var http = new HttpClient(handler))
{
//使用FormUrlEncodedContent做HttpContent
var content = new FormUrlEncodedContent(new Dictionary<string, string>()
{
{"Name","修改zzl"},
{"Info", "Put修改动作"}//键名必须为空
}); //await异步等待回应 var response = await http.PutAsync(url, content);
//确保HTTP成功状态值
response.EnsureSuccessStatusCode();
//await异步读取最后的JSON(注意此时gzip已经被自动解压缩了,因为上面的AutomaticDecompression = DecompressionMethods.GZip)
Console.WriteLine(await response.Content.ReadAsStringAsync());
} }
转:http://www.cnblogs.com/lori/p/4045633.html

通过HttpClient来调用Web Api接口~续~实体参数的传递的更多相关文章

  1. WebApi系列~通过HttpClient来调用Web Api接口~续~实体参数的传递

    回到目录 上一讲中介绍了使用HttpClient如何去调用一个标准的Web Api接口,并且我们知道了Post,Put方法只能有一个FromBody参数,再有多个参数时,上讲提到,需要将它封装成一个对 ...

  2. WebApi系列~通过HttpClient来调用Web Api接口~续~实体参数的传递 【转】

    原文:http://www.cnblogs.com/lori/p/4045633.html 下面定义一个复杂类型对象 public class User_Info { public int Id { ...

  3. 通过HttpClient来调用Web Api接口,实体参数的传递

    下面定义一个复杂类型对象 public class User_Info { public int Id { get; set; } public string Name { get; set; } p ...

  4. Http下的各种操作类.WebApi系列~通过HttpClient来调用Web Api接口

    1.WebApi系列~通过HttpClient来调用Web Api接口 http://www.cnblogs.com/lori/p/4045413.html HttpClient使用详解(java版本 ...

  5. WebApi系列~通过HttpClient来调用Web Api接口

    回到目录 HttpClient是一个被封装好的类,主要用于Http的通讯,它在.net,java,oc中都有被实现,当然,我只会.net,所以,只讲.net中的HttpClient去调用Web Api ...

  6. 通过HttpClient来调用Web Api接口

    回到目录 HttpClient是一个被封装好的类,主要用于Http的通讯,它在.net,java,oc中都有被实现,当然,我只会.net,所以,只讲.net中的HttpClient去调用Web Api ...

  7. c# 【MVC】WebApi通过HttpClient来调用Web Api接口

    /// <summary> /// HttpClient实现Post请求(异步) /// </summary> static async void dooPost() { st ...

  8. WebApi~通过HttpClient来调用Web Api接口

    异步请求 ///<summary> /// HttpClient实现Post请求(异步) /// </summary> static async void dooPost() ...

  9. 【WebApi】通过HttpClient调用Web Api接口

    HttpClient是一个封装好的类,它在很多语言中都有被实现,现在HttpClient最新的版本是4.5. 它支持所有的http方法,自动转向,https协议,代理服务器. 一.Api接口参数标准化 ...

随机推荐

  1. 【读书笔记】iOS-Tagged Pointer对象-注意事项

    一,2013年9月,苹果推出了iPhone5s,与此同时,iPhone5s配备了首个采用64位架构的A7双核处理器,为了节省内存和提高执行效率,苹果提出了Tagged Pointer的概念. 对于64 ...

  2. swift基础一

    // swift中导入类库使用import,不再使用<>和"" import Foundation // 输出 print("Hello, World!&qu ...

  3. iOS之UI--通讯录的实例关键知识技术点积累

    通讯录的实例关键知识技术点积累 效果展示: 作为博文笔记,既然是笔记,目的是为了能够以后做这个项目能够快速上手,如果这是我下一次阅览这个博文笔记,那么我应该先空手从零开始做,需求也就是这个项目的展示效 ...

  4. android 开发小记

    1.fragment & activity when config changes, activity will restart but fragment can be store. 2.te ...

  5. Python yield 使用浅析(iterable generator )

    http://blog.csdn.net/preterhuman_peak/article/details/40615201 如何生成斐波那契數列 斐波那契(Fibonacci)數列是一个非常简单的递 ...

  6. forfiles命令批量删除N天前文件

    在整理手上几台SQL SERVER 2000的数据库备份时,一方面为了方便快速还原数据库,另外一方面为了备份冗余.备份方式统一(先备份到本地,然后收上磁带),将以前通过Symantec Backup ...

  7. [实践] ubuntu下编译安装ambari

    ambari是一个Hadoop套件的管理工具,可以方便部署.管理及监控.最初开发时使用的就是RH系的Linux,只支持RHEL.CentOS5/6.OEL.SLES,暂不支持Ubuntu:可我的需求就 ...

  8. ubuntu自带的gedit编辑器添加Markdown预览插件

    gedit安装Markdown Preview Ubuntu自带的gedit编辑器也是有很强大的功能的,且支持插件的安装.对于喜欢用Markdown的我来说,这当然是很好的了,gedit本身 就支持M ...

  9. sigemptyset,sigfillset,sigaddset,sigdelset,sigismember,sigprocmask,sigpendmask作用

    SYNOPSIS #include <signal.h> int sigemptyset(sigset_t *set); int sigfillset(sigset_t *set); in ...

  10. 【MVC 4】3.MVC 基本工具(创建示例项目、使用 Ninject)

    作者:[美]Adam Freeman      来源:<精通ASP.NET MVC 4> 本次将考察三类工具,它们是每一位 MVC 程序员工具库的成员:DI容器.单元测试框架和模仿工具. ...