这里所讲的get与post请求,与平时我们在前台通过js传的get与post并不相同。比如我们有这样的一个场景:我们需要读取一个api的数据,在这个过程,我们想要在后台进行封装,从而返回给前台一个操作结果。就好像,我们在做微信开发的时候,自定义菜单、获取Access_Token我们都是通过在后台对其进行get和post请求来封装。比较抽象,示意图如下:
首先创建一个API项目,并创建一个类:
NuGet:Microsoft.AspNetCore.Mvc.NewtonsoftJson 作为格式化JSON字符串的工具类。这里掌握两个方法即可:
SerializeObject:将任意的object转换为JSON字符串
DeserializeObject< T >:将JSON字符串转换数据模型
public class Product
{
/// <summary>
/// 物料编号
/// </summary>
public string MaterialNo { get; set; }
/// <summary>
/// 物料名称
/// </summary>
public string MaterialName { get; set; }
/// <summary>
/// 数量
/// </summary>
public int Quntity { get; set; }
/// <summary>
/// 生产日期
/// </summary>
public string ProductDate { get; set; }
}
创建一个空的API控制器Values,代码如下:
[HttpGet]
public IEnumerable<Product> Get()
{
List<Product> list = new List<Product>();
for (int i = 0; i < 3; i++)
{
Product model = new Product()
{
MaterialNo="ASN20200506"+i,
MaterialName="精品盒"+i,
Quntity=2000,
ProductDate=DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
};
list.Add(model);
}
return list;
}
[HttpGet("{MaterialNo}")]
public Product Get(string MaterialNo)
{
return new Product()
{
MaterialNo = MaterialNo,
MaterialName = "GET精品盒:" + MaterialNo,
Quntity = 2000,
ProductDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
};
}
[HttpPost]
public object Post(Product model)
{
return JsonConvert.SerializeObject(model);
}
作一下代码说明:
默认的GET:请求列表
带参的GET:请求给定的值
POST方法:用于提供其他项目对该API的POST请求
运行程序,切忌不要关闭,因为其他项目要进行调用
请求规则:/api/控制器名称
创建一个新的Web项目,同样创建一个和上面相同的类,并对HomeComtroller进行改造
NuGet:Microsoft.AspNetCore.Mvc.NewtonsoftJson 作为格式化JSON字符串的工具类。
作一下简单代码说明:
进行Request的时候,ContentType和Method是必须的
ContentType:application/json;charset=utf-8指定参数类型
Method:post 指定指定对其进行 get 还是 post
其余的照搬即可
public IActionResult Index()
{
string url = "http://localhost:64643/api/values";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
Stream stream = res.GetResponseStream();
StreamReader reader = new StreamReader(stream);
List<Product> result = JsonConvert.DeserializeObject<List<Product>>(reader.ReadToEnd());
reader.Close();
stream.Close();
return Json(result);
//return View();
}
public IActionResult Get()
{
string url = "http://localhost:64643/api/values/ASN20200128";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
Stream stream = res.GetResponseStream();
StreamReader reader = new StreamReader(stream);
Product model = JsonConvert.DeserializeObject<Product>(reader.ReadToEnd());
reader.Close();
stream.Close();
return Json(model);
}
public IActionResult Post()
{
Product model = new Product()
{
MaterialNo = "ASN20200506",
MaterialName = "POST精品盒",
Quntity = 2000,
ProductDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
};
string str = JsonConvert.SerializeObject(model);
string url = "http://localhost:64643/api/values";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "post";
req.ContentType = "application/json;charset=utf-8";
Stream reqStream = req.GetRequestStream();
byte[] reqBytes = Encoding.UTF8.GetBytes(str);
reqStream.Write(reqBytes, 0, reqBytes.Length);
reqStream.Close();
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
Stream resStream = res.GetResponseStream();
StreamReader reader = new StreamReader(resStream);
var result = JsonConvert.DeserializeObject<Product>(reader.ReadToEnd());
reader.Close();
resStream.Close();
return Json(result);
}
对默认GET进行远程调用测试:
与定义的数据相同,请求成功!
对带参的GET进行测试:
与预想的数据一致,成功!
对POST进行验证:
与返回值相同,成功!
仍需注意的一点是,当部署API项目在服务器上的时候,是要对该项目作跨域配置的,下一节我们再进行详细讲解,如何配置跨域。