并且我们知道了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);
}
}
});
结果截图
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());
}
}